numpy传递部分定义的文件名到genfromtxt

时间:2014-02-02 20:22:13

标签: python numpy

我有数据文件,我知道他们名字的开头和结尾。名称结构如下: ### _ random_string.EXT 其中###是从000到999的数字,EXT是文件扩展名(这里是csv)。文件的数量可能很大,这就是为什么我使用python代码来处理它们(平滑,过滤,绘图......)。 处理这些文件的代码将使用numpy.genfromtxt来加载每个文件的数据。我将把numpy.genfromtxt放在一个循环中,该循环遍历与要处理的文件对应的数字列表(FilesNum)。我想用'FilesNum'给出的###和扩展名来构造文件名。这是一个开始:

import numpy as np
import glob
import re

FilesNum = range(0, 350, 2)
EXT = 'csv'
X, Y = [], []
for num in FilesNum:
    data = np.genfromtxt(glob.glob(str(num) + '*' + EXT), delimiter = ';')
    X.append(data[:, 0])
    Y.append(data[:, 1])

我的问题是glob.glob(FilesNum +'*'+ EXT)不是我需要的,因为它应该生成一个列表。在我的具体情况下,每个数字只对应一个文件。考虑到这一点,我需要一个代码,它将用文件名中缺少的部分替换'*'。

如果以0开头的文件是'000_random_string.csv':

np.genfromtxt(glob.glob('000_' + '*' + '.csv'), delimiter = ',')
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-24-fefca52f40e1> in <module>()
----> 1 np.genfromtxt(glob.glob('%03d' % 0 + '*' + '.csv'), delimiter = ',')

/usr/lib64/python2.7/site-packages/numpy/lib/npyio.pyc in genfromtxt(fname, dtype, comments, delimiter, skiprows, skip_header, skip_footer, converters, missing, missing_values, filling_values, usecols, names, excludelist, deletechars, replace_space, autostrip, case_sensitive, defaultfmt, unpack, usemask, loose, invalid_raise)
   1294     # Skip the first `skip_header` rows
   1295     for i in xrange(skip_header):
-> 1296         fhd.next()
   1297 
   1298     # Keep on until we find the first valid values

StopIteration: 

while:

np.genfromtxt('000_random_string.csv', delimiter = ',')
Out[30]: 
array([[  350.   ,  -210.   ],
       [  351.4  ,  -210.   ],
       [  352.8  ,   -42.608],
       ..., 
       [ 1747.2  ,   -62.798],
       [ 1748.6  ,  -210.   ],
       [ 1750.   ,  -210.   ]])

请注意:

glob.glob('%03d' % 0 + '*' + '.csv')
Out[31]: ['000_random_string.csv']

3 个答案:

答案 0 :(得分:1)

好的,我找到了解决办法。我只需要给glob.glob()一个索引。正如我所说的,每个数字只存在一个文件,所以给索引0将始终做我想要的。

np.genfromtxt(glob.glob('000_' + '*' + '.csv')[0], delimiter = ',')
                                               ^
                                               |-- the solution
Out[5]: 
array([[  350.   ,  -210.   ],
       [  351.4  ,  -210.   ],
       [  352.8  ,   -42.608],
       ..., 
       [ 1747.2  ,   -62.798],
       [ 1748.6  ,  -210.   ],
       [ 1750.   ,  -210.   ]])

答案 1 :(得分:0)

您缺少文件目录的路径。

此外,没有必要在文件名上调用glob.glob。

f_name = '.'.join([str(num), ext])

应该这样做。它将file_number转换为字符串并将其与文件扩展名连接(分隔符为点)。

然后文件的完整路径是:

import os
f_path = os.path.join(dir_path, f_name)

编辑:感谢您的评论。我应该先用谷歌搜索,现在我得到了问题(可能)。会保持原样。

答案 2 :(得分:0)

好的,我认为我们接近解决方案:

我认为如果你使用提示你提供的%-formating的提示你在那里(但如果我正确地告诉你,如果random_strings不同,你仍然需要glob)。 所以你的文件是0000_randomstring1.csv,0000_randomstring2.csv ... 0000_randomstringN.csv,0002_randomstring1.csv,0002_randomstring2.csv ... 0000_randomstringN.csv ... 0350_randomstringN.csv,对吗?并且你想要读取具有相同编号的那些,就像它们是一个文件一样,对吧?

然后这可以工作:

import numpy as np
import glob
import re

FilesNum = range(0, 350, 2)
EXT = 'csv'
X, Y = [], []
for num in FilesNum:
    data = np.genfromtxt(glob.glob( "%04d*%s"%( num, EXT ) ), delimiter = ';').T
    X.append( data[0] )
    Y.append( data[1] )

如果您只想将所有文件读入一个大文件,您也可以这样做

AllFilesAsList = glob.glob( "0*.csv" )
X,Y = np.genfromtxt(AllFilesAsList, delimiter = ';').T

哦,现在我明白了:

所以我建议你做的就是

Files = [ glob.glob( "%04d*%s"%( num, EXT ) for num in range(0,350,2) )]

现在你可以查看它找到的所有文件,你的循环变得更具可读性

for f in Files:
    data = np.genfromtxt( f, delimiter = ';').T
    X.append( data[0] )
    Y.append( data[1] )