Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pythonic将数据从多个文件导入到一个数组中的方法_Python_Arrays_File_Import_Numpy - Fatal编程技术网

Pythonic将数据从多个文件导入到一个数组中的方法

Pythonic将数据从多个文件导入到一个数组中的方法,python,arrays,file,import,numpy,Python,Arrays,File,Import,Numpy,我对Python比较陌生,想知道如何最好地将多个文件中的数据导入到单个数组中。我有相当多的文本文件,其中包含50行两列数据(以列分隔),例如: - 假设我有10个文本文件要导入,并导入到名为data的变量中 我想创建一个包含所有数据的3D数组。这样,我可以通过data[:,:,n]引用数据来轻松地绘制和操作数据,其中n引用文本文件的索引 我认为这样做的方法是拥有一个shape数组(50、2、10),但不知道如何最好地使用python来创建它。我曾考虑过使用循环将每个文本文件作为二维数组导入,然后

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

-

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

我想创建一个包含所有数据的3D数组。这样,我可以通过
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]