假设我在文件夹中有三个文件:file9.txt,file10.txt和file11.txt,我想按照这个特定的顺序阅读它们。任何人都可以帮我这个吗?
现在我正在使用代码
import glob, os
for infile in glob.glob(os.path.join( '*.txt')):
print "Current File Being Processed is: " + infile
然后它首先读取file10.txt,然后读取file11.txt,然后读取file9.txt。
有人可以帮助我如何获得正确的订单吗?
答案 0 :(得分:58)
文件系统上的文件未排序。您可以使用sorted()
function:
for infile in sorted(glob.glob('*.txt')):
print "Current File Being Processed is: " + infile
请注意,代码中的os.path.join
调用是无操作的;只有一个参数,它不会做任何事情,只会使该参数不加改变。
请注意,您的文件将按字母顺序排序,这会将10
置于9
之前。您可以使用自定义键功能来改进排序:
import re
numbers = re.compile(r'(\d+)')
def numericalSort(value):
parts = numbers.split(value)
parts[1::2] = map(int, parts[1::2])
return parts
for infile in sorted(glob.glob('*.txt'), key=numericalSort):
print "Current File Being Processed is: " + infile
numericalSort
函数拆分文件名中的任何数字,将其转换为实际数字,并返回结果进行排序:
>>> files = ['file9.txt', 'file10.txt', 'file11.txt', '32foo9.txt', '32foo10.txt']
>>> sorted(files)
['32foo10.txt', '32foo9.txt', 'file10.txt', 'file11.txt', 'file9.txt']
>>> sorted(files, key=numericalSort)
['32foo9.txt', '32foo10.txt', 'file9.txt', 'file10.txt', 'file11.txt']
答案 1 :(得分:8)
您可以将glob.glob( ... )
表达式包装在sorted( ... )
语句中,并对生成的文件列表进行排序。例如:
for infile in sorted(glob.glob('*.txt')):
您可以给sorted
一个比较函数,或者更好的是,使用key= ...
参数为它提供一个用于排序的自定义键。
示例:
有以下文件:
x/blub01.txt
x/blub02.txt
x/blub10.txt
x/blub03.txt
y/blub05.txt
以下代码将生成以下输出:
for filename in sorted(glob.glob('[xy]/*.txt')):
print filename
# x/blub01.txt
# x/blub02.txt
# x/blub03.txt
# x/blub10.txt
# y/blub05.txt
现在有关键功能:
def key_func(x):
return os.path.split(x)[-1]
for filename in sorted(glob.glob('[xy]/*.txt'), key=key_func):
print filename
# x/blub01.txt
# x/blub02.txt
# x/blub03.txt
# y/blub05.txt
# x/blub10.txt
修改强> 可能这个关键功能可以对您的文件进行排序:
pat=re.compile("(\d+)\D*$")
...
def key_func(x):
mat=pat.search(os.path.split(x)[-1]) # match last group of digits
if mat is None:
return x
return "{:>10}".format(mat.group(1)) # right align to 10 digits.
肯定可以改进,但我认为你明白了。没有数字的路径将保持不变,带数字的路径将转换为10位宽的字符串并包含数字。
答案 2 :(得分:0)
glob.glob(os.path.join( '*.txt'))
返回字符串列表,因此您可以使用pythons sorted() function轻松对列表进行排序。
sorted(glob.glob(os.path.join( '*.txt')))
答案 3 :(得分:0)
您需要通过隔离文件名中的数字将排序从“ASCIIBetical”更改为数字。你可以这样做:
import re
def keyFunc(afilename):
nondigits = re.compile("\D")
return int(nondigits.sub("", afilename))
filenames = ["file10.txt", "file11.txt", "file9.txt"]
for x in sorted(filenames, key=keyFunc):
print xcode here
您可以使用glob.glob(“*。txt”)的结果设置文件名;
另外,keyFunc函数假设文件名中包含一个数字,并且该数字仅在文件名中。您可以将该功能更改为您需要的复杂功能,以隔离您需要排序的数字。
答案 4 :(得分:-1)
for fname in ['file9.txt','file10.txt','file11.txt']:
with open(fname) as f: # default open mode is for reading
for line in f:
# do something with line