我有几个表文件,我加载它们:
x, y, rho, phi = np.loadtxt(myfile, unpack=True)
现在,考虑一下我有myfile1
并且myfile2
格式相同的情况。如何将它们加载到相同的数组中(好像只有一个文件)?
有多种方法可以做到这一点(例如,您可以加载两个数组,然后通过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.GzipFile
或bz2.BZ2File
替换open
上述文件。
但是,如果您需要处理可能压缩的文件,则必须进行相同的扩展检查numpy
,然后创建适当的对象(编写一个open_compressed
将其包装起来的函数),此时这将变得顽固地坚持错误的解决方案。所以,如果这是一个问题,我可能会单独加载它们,然后再做numpy.concatenate
.
您可以使用标准文件输入模块:
import fileinput
import glob
import numpy as np
data = np.loadtxt(fileinput.input(glob.glob("*.dat")))