2011-07-19 30 views
5

我正在使用一个程序,该程序根据从目录中读取文件的顺序将输出写入csv文件。但是,大量的文件结尾为1,2,3,4,5,6,7,8,9,10,11,12。我的程序实际上是按照字母顺序读取文件的:1,10,11,12 ....,2,20,21 ..... 99。问题是另一个程序假定排序是按照数字顺序排列的,并且倾斜了图表结果。如何在阅读前对目录中的文件进行排序?

的实际文件看起来像:String.ext.ext2.1.txt, String.ext.ext2.2.txt,等等...

我怎样才能做到这一点用python脚本?

回答

12
files = ['String.ext.ext2.1.txt', 'String.ext.ext2.12.txt', 'String.ext.ext2.2.txt'] 
# files: coming from os.listdir() sorted alphabetically, thus not numerically 

sorted_files = sorted(files, key=lambda x: int(x.split('.')[3])) 
# returns: ['String.ext.ext2.1.txt', 'String.ext.ext2.2.txt', 'String.ext.ext2.12.txt'] 
+0

你能解释第二条线的工作原理吗? – Jim

+2

'sorted_files = sorted(files,key = lambda x:int(x.split('。')[3]))' 'sorted'函数使用第二个参数给出的选择器对它的第一个参数进行排序。考虑按某个列对表格进行排序。 现在,第二个参数。它是一个函数,用于将文件名转换为部分列表(以'.'分隔)并将第三个元素放入该列表中。 –

+1

了解它的工作方式:sorted_files = sorted(file_list,key = lambda x:int(x。 split('。')[3])if(x.endswith(“txt”))else x) – Jim

5

对程序中的文件列表进行排序。不要依赖操作系统调用以正确的顺序提供文件,这取决于正在使用的实际文件系统。

1

您可以使用这样的事情:

fileNames = ['String.ext.ext2.2.txt', 'String.ext.ext2.20.txt', 'String.ext.ext2.1.txt', 'String.ext.ext2.10.txt', 'String.ext.ext2.11.txt', 'String.ext.ext2.0.txt',] 
fileNames = sorted(fileNames, key=lambda y: int(y.rsplit('.', 2)[1])) 
相关问题