Pythonic方法将数据从多个文件导入数组

时间:2012-11-29 14:08:52

标签: python arrays file import numpy

我对Python比较陌生,想知道如何最好地将多个文件中的数据导入到一个数组中。我有很多文本文件包含50行两列数据(列分隔),例如:

Length=10.txt:     
1, 10    
2, 30    
3, 50   
#etc
END OF FILE

-

Length=20.txt
1, 50.7
2, 90.9
3, 10.3
#etc
END OF FILE

假设我有10个文本文件要导入并导入名为 data 的变量。

我想创建一个包含所有数据的3D数组。这样,我可以通过data[:,:,n]引用数据轻松地绘制和操作数据,其中n指的是文本文件的索引。

我认为我这样做的方法是拥有一个形状数组(50,2,10),但不知道如何最好地使用python来创建它。我已经考虑过使用循环将每个文本文件导入为2D数组,然后将它们堆叠起来创建一个2D数组,虽然找不到合适的命令来执行此操作(我在numpy中查看了vstack和column_stack但是这些似乎没有增加额外的维度。)

到目前为止,我已经编写了导入代码:

    file_list = glob.glob(source_dir + '/*.TXT') #Get folder path containing text files

    for file_path in file_list:
      data = np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18)

但是这段代码的问题在于我只能在for循环中处理数据。

我真正想要的是从文本文件导入的所有数据的数组。

非常感谢任何帮助,谢谢!

5 个答案:

答案 0 :(得分:7)

“但是这段代码的问题在于我只能在for循环中处理数据。”

假设您的代码有效:

# Get folder path containing text files
file_list = glob.glob(source_dir + '/*.TXT')
data = []
for file_path in file_list:
    data.append(
        np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18))
# now you can access it outside the "for loop..."
for d in data:
    print d

答案 1 :(得分:1)

您正在寻找一个[txt column1,txt column2,filename]?

的数组
file_list = glob.glob(source_dir + '/*.TXT') #Get folder path containing text files


for num,file_path in enumerate(file_list):
  data = np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18)
  data = np.vstack((data.T,np.ones(data.shape[0])*num)).T
  if num==0: Output=data
  else: Output=np.vstack((Output,data))

另一种选择,如果你不想转置两次。

  data = np.vstack((data,(np.ones(data.shape[0])*num).reshape(-1,1)))

答案 2 :(得分:1)

如果所有数据的形状相同,则只需附加到列表中。

all_data = [] 

并在你的循环中:

all_data.append(data)

最后你有

asarray(all_data)

是形状数组(10,50,2)(如果需要,可以移调)。 如果形状不匹配,那么这不起作用,numpy不能处理不同形状的行。然后,您可能需要另一个循环来创建最大形状的数组,并复制数据。

答案 3 :(得分:1)

原油但很快

listFiles=["1.txt","2.txt", ... ,"xxx.txt"]
allData=[]
for file in listFiles:
    lines = open(file,'r').readlines()

    filedata = {}
    filedata['name'] = file
    filedata['rawLines'] = lines
    col1Vals = []
    col2Vals = []
    mapValues = {}

    for line in lines:           
       values = line.split(',')
       col1Vals.append(values[0])
       col2Vals.append(values[1])
       mapValues[values[0]] = values[1]
    filedata['col1'] = col1Vals
    filedata['col2'] = col2Vals
    filedata['map'] = mapValues
    allData.append(filedata)


如果要获取特定目录中的文件列表,请查看os.walk

由于目前尚不清楚您希望如何获得数据,因此我展示了多种存储方式。

allData是一个词典列表

从第3个文件中获取第2列数据allData[2]['col2']

如果您想要第三个文件的名称alldata[2]['name']

答案 4 :(得分:0)

也许你可以这样做:

file_list = glob.glob(source_dir + '/*.TXT') # Get folder path containing text files
data = [np.genfromtxt(file_path, delimiter=',', skip_header=3, skip_footer=18)
        for file_path in file_list]