如何使用loadtxt在python中加载相同数组中的多个文件?
我有多个表文件,并使用以下内容加载它们:如何使用loadtxt在python中加载相同数组中的多个文件?,python,arrays,numpy,Python,Arrays,Numpy,我有多个表文件,并使用以下内容加载它们: x, y, rho, phi = np.loadtxt(myfile, unpack=True) 现在,考虑具有相同格式的< MyFiel1 和 MyFiel2的情况。如何在相同的数组中加载它们(就像有一个文件一样)?有多种方法可以做到这一点(例如,您可以加载两个数组,然后通过x=numpy.concatenate((x1,x2))等将它们连接起来),但我要做的是动态连接文件,并将结果传递给loadtxt 如上所述,fname可以是: 要读取的文件、
x, y, rho, phi = np.loadtxt(myfile, unpack=True)
现在,考虑具有相同格式的< <代码> MyFiel1 和<代码> MyFiel2<代码>的情况。如何在相同的数组中加载它们(就像有一个文件一样)?
有多种方法可以做到这一点(例如,您可以加载两个数组,然后通过x=numpy.concatenate((x1,x2))
等将它们连接起来),但我要做的是动态连接文件,并将结果传递给loadtxt
如上所述,fname
可以是:
要读取的文件、文件名或生成器。如果文件扩展名为.gz或.bz2,则首先解压缩该文件。注意,生成器应该返回Python 3k的字节字符串
所以,您只需要一个生成器来生成myfile1,然后是myfile2
要做到这一点,最明显的方法是使用itertools
:
with open(myfile1, 'rb') as f1, open(myfile2, 'rb') as f2:
x, y, rho, phi = numpy.loadtxt(itertools.chain(f1, f2))
您可能会注意到,我没有使用unpack=True
。这是因为unpack
仅在传递文件名时有效,而不是传递文件对象或生成器。(它关注的是扩展名,而不是文件魔法或任何花哨的东西。)
如果您知道文件将始终是gzip或bzip2文件,您可以将上面的打开
替换为gzip.gzip文件
或bz2.bz2文件
但是,如果您需要处理可能的压缩文件,您必须执行与
numpy
相同的扩展名检查,然后创建适当的对象(编写一个open\u compressed
函数来包装该对象),在这一点上,这将顽固地坚持错误的解决方案。因此,如果这是一个问题,我可能会单独加载它们,然后执行numpy.concatenate
您可以使用标准的fileinput模块:
import fileinput
import glob
import numpy as np
data = np.loadtxt(fileinput.input(glob.glob("*.dat")))
好吧,你的工作超过两个文件。我真的希望Python中有一个“with expression”,这样您就可以作为一个单独的生成器来完成整个工作,而不是像您的版本那样,使用带有生成器的
块来完成整个工作,这将通过一个压缩文件逐行迭代…这通常可以工作(使用'rb'
模式),但行可能非常庞大,这可能是一个问题。我只是通过创建随机大数组并将它们压缩到67K行来进行测试,它似乎工作得很好,但可能值得进行更艰苦的测试?这会有点疯狂…这真的适用于压缩文件吗?您没有传递文件名,而是传递了一个文件对象。numpy是否检查文件对象并动态解压缩输入流?这将有点酷…作为旁白,itertools.chain将删除存储在文件对象中的所有文件名信息,numpy可能已经能够检查这些信息。我怀疑你得到的是与你输入的相同的随机数组(但你可以检查)。@mgilson:事实上,我没有用numpy进行测试,我更间接地进行了测试……不,它不起作用,除非你非常幸运……所以,答案还有一个问题。至于with表达式的语法,是的,这是个棘手的部分。我的想法是,它必须出现在生成器表达式中,所以更像是foo中的一行一行,open(…)作为foo,但它仍然很难看,我认为不值得写一篇PEP,因为我知道Guido会在它上面呕吐。我总是忘记,fileinput
不仅仅可以用于默认的“sys.argv[1://code>或stdin”情况…