我试图编写一个程序,用Python为我绘制大量图表,我的数据都具有相同的名称格式:
info_scan1.csv,info_scan2.csv,info_scan3.csv等,其中info是每个文件的不同字符串。
我需要成对绘制数据,即在同一个绘图上扫描1和2,扫描3和4,扫描5和6等等。所以我想按{{1}对文件名列表进行排序}' scan'。我该怎么做?
我使用int
将所有文件名放在列表中。
干杯。
答案 0 :(得分:1)
您可以从当前目录中获取所有文件:
files = [x for x in os.listdir('.') if os.path.isfile(x)]
所以files
是目录.
中的文件名列表。然后你必须按文件名中间的数字对这个列表进行排序,我看到了这个解决方案:
files.sort(key=lambda f: int(re.search("(\d+)", f).group(1)))
这使用文件名中的数字在数字上对就地files
列表进行排序。然后你应该在循环中在这个列表中取两个值。 itertools模块有配方,其中一个是'石斑鱼功能:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *arg)
所以你可以这样做:
>>> for f in grouper(files, 2):
... print f # f here is a tuple of two files. f[0] is the first and f[1] is the second one
...
('info_scan1.csv', 'info_scan2.csv')
('info_scan3.csv', 'info_scan4.csv')
('info_scan5.csv', 'info_scan6.csv')
('info_scan7.csv', 'info_scan8.csv')
('info_scan9.csv', 'info_scan12.csv')
('info_scan57.csv', 'info_scan58.csv')
答案 1 :(得分:0)
如果文件名具有相同的数字精度(如果scan09.csv
,而不是scan9.csv
,则先于scan10.csv
),那么简单list.sort()
就可以执行此操作。如果没有,那么你想要做的就是“自然排序”:google for python recipes。
答案 2 :(得分:0)
试试这段代码:
name_list = ['_scan1.csv','_scan7.csv','_scan3.csv']
f = lambda s: int(s.replace('.csv','').replace('_scan',''))
sorted(name_list,key = f)
['_scan1.csv', '_scan3.csv', '_scan7.csv']