我想缩写我用loadtxt导入多个文件的方式,我会做下一个:
rc1 =loadtxt("20120701_Gp_xr_5m.txt", skiprows=19)
rc2 =loadtxt("20120702_Gp_xr_5m.txt", skiprows=19)
rc3 =loadtxt("20120703_Gp_xr_5m.txt", skiprows=19)
rc4 =loadtxt("20120704_Gp_xr_5m.txt", skiprows=19)
rc5 =loadtxt("20120705_Gp_xr_5m.txt", skiprows=19)
rc6 =loadtxt("20120706_Gp_xr_5m.txt", skiprows=19)
rc7 =loadtxt("20120707_Gp_xr_5m.txt", skiprows=19)
rc8 =loadtxt("20120708_Gp_xr_5m.txt", skiprows=19)
rc9 =loadtxt("20120709_Gp_xr_5m.txt", skiprows=19)
rc10 =loadtxt("20120710_Gp_xr_5m.txt", skiprows=19)
然后我使用以下方法连接它们:
GOES =concatenate((rc1,rc2,rc3,rc4,rc5,rc6,rc7,rc8,rc9,
rc10),axis=0)
但我的问题是:我想减少所有这些吗?也许有FOR或类似的东西。由于文件是日期(字符串)的保证。
我在考虑做这样的事情
day = ####我不知道如何定义从01到31的字符串,例如
data="201207"+day+"_Gp_xr_5m.txt"
然后这样做,但我认为不正确
GOES=loadtxt(data, skiprows=19)
答案 0 :(得分:6)
是的,您可以轻松地使用for
循环或具有等效列表推导的子数组。使用glob module获取所需的文件名:
import numpy as np # you probably don't need this line
from glob import glob
fnames = glob('path/to/dir')
arrays = [np.loadtxt(f, skiprows=19) for f in fnames]
final_array = np.concatenate(arrays)
如果内存使用成为问题,您还可以iterate over all files line by line by chaining them并将该生成器提供给np.loadtxt
。
编辑
glob
的示例不太清楚..
您可以使用“通配符”*
来匹配文件,例如glob('*')
获取当前目录中所有文件的列表。因此,上面代码的一部分可以更好地编写为:
fnames = glob('path/to/dir/201207*_Gp_xr_5m.txt')
或者,如果您的程序已从正确的目录运行:
fnames = glob('201207*_Gp_xr_5m.txt')
我之前忘记了这一点,但你也应该对文件名列表进行排序,因为glob
的文件名列表不能保证排序。
fnames.sort()
稍微不同的方法,更多的是你所想的方向如下。当变量day
包含日期编号时,您可以将其放在文件名中,如下所示:
daystr = str(day).zfill(2)
fname = '201207' + daystr + '_Gp_xr_5m.txt'
或使用聪明的格式说明符:
fname = '201207{:02}_Gp_xr_5m.txt'.format(day)
或“旧”方式:
fname = '201207%02i_Gp_xr_5m.txt' % day
然后在for
- 循环中使用它:
arrays = []
for day in range(1, 32):
daystr = str(day).zfill(2)
fname = '201207' + daystr + '_Gp_xr_5m.txt'
a = np.loadtxt(fname, skiprows=19)
arrays.append(a)
final_array = np.concatenate(arrays)