Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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
如何使用loadtxt在python中加载相同数组中的多个文件?_Python_Arrays_Numpy - Fatal编程技术网

如何使用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”情况…