Pythonic将数据从多个文件导入到一个数组中的方法
我对Python比较陌生,想知道如何最好地将多个文件中的数据导入到单个数组中。我有相当多的文本文件,其中包含50行两列数据(以列分隔),例如: - 假设我有10个文本文件要导入,并导入到名为data的变量中 我想创建一个包含所有数据的3D数组。这样,我可以通过Pythonic将数据从多个文件导入到一个数组中的方法,python,arrays,file,import,numpy,Python,Arrays,File,Import,Numpy,我对Python比较陌生,想知道如何最好地将多个文件中的数据导入到单个数组中。我有相当多的文本文件,其中包含50行两列数据(以列分隔),例如: - 假设我有10个文本文件要导入,并导入到名为data的变量中 我想创建一个包含所有数据的3D数组。这样,我可以通过data[:,:,n]引用数据来轻松地绘制和操作数据,其中n引用文本文件的索引 我认为这样做的方法是拥有一个shape数组(50、2、10),但不知道如何最好地使用python来创建它。我曾考虑过使用循环将每个文本文件作为二维数组导入,然后
data[:,:,n]
引用数据来轻松地绘制和操作数据,其中n
引用文本文件的索引
我认为这样做的方法是拥有一个shape数组(50、2、10),但不知道如何最好地使用python来创建它。我曾考虑过使用循环将每个文本文件作为二维数组导入,然后将它们堆叠起来创建二维数组,尽管找不到相应的命令来执行此操作(我在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循环中处理数据
我真正想要的是从文本文件导入的所有数据的数组
任何帮助都将不胜感激,谢谢 您正在寻找[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)))
如果所有数据的形状相同,则只需将其附加到列表中即可
all_data = []
在你的循环中:
all_data.append(data)
终于有了
asarray(all_data)
这是一个形状(10,50,2)的数组(如果需要,可以转置)。
如果形状不匹配,则这不起作用,但numpy无法处理不同形状的行。然后,您可能需要另一个创建最大形状数组的循环,并将数据复制过来。“但此代码的问题是,我只能在数据位于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
粗而快
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)
如果要从特定目录获取文件列表,请查看 由于不清楚您希望如何使用数据,我已经展示了许多存储数据的方法
allData
是字典列表要从第三个文件中获取第二列数据,您可以执行
allData[2]['col2']
如果您想要第三个文件的名称
alldata[2]['name']
也许您可以这样做:
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]
谢谢,这很简单,效果也很好-我确实尝试过类似的方法,但是错过了'asarray'命令。我不知道没有它就不会是一个数组。谢谢,这改进了cronos的答案。
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)
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]