10

我对 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]wheren引用文本文件的索引来引用数据,从而轻松地绘制和操作数据。

我认为我这样做的方法是拥有一个形状数组(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 循环中处理数据。

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

任何帮助将不胜感激谢谢!

4

5 回答 5

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
于 2012-11-29T14:27:41.997 回答
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)))
于 2012-11-29T14:25:51.837 回答
1

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

all_data = [] 

在你的循环中:

all_data.append(data)

最后你有

asarray(all_data)

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

于 2012-11-29T14:27:22.320 回答
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是一个字典列表

从你可以做的第三个文件中获取第二列数据allData[2]['col2']

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

于 2012-11-29T14:38:23.367 回答
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]
于 2013-05-28T22:01:08.647 回答