我对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循环中处理数据。
我真正想要的是从文本文件导入的所有数据的数组。
非常感谢任何帮助,谢谢!
答案 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]