我有数据文件,我知道他们名字的开头和结尾。名称结构如下: ### _ 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']
答案 0 :(得分:1)
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] )