我在文件夹上有一堆数字排序的文件,当我尝试对glob.glob排序时,我从来没有按正确的顺序得到文件。
文件示例和预期输出排序
folder
------
C:\Users\user\Desktop\folder\1 sample.mp3
C:\Users\user\Desktop\folder\2 sample.mp3
C:\Users\user\Desktop\folder\3 sample.mp3
C:\Users\user\Desktop\folder\4 sample.mp3
C:\Users\user\Desktop\folder\5 sample.mp3
... over 800 files...
我尝试了什么,,但是输出看起来是随机的
files = sorted(glob.glob(f'{os.getcwd()}/*.mp3'), key=lambda x: (os.path.splitext(os.path.basename(x))[0]))
C:\Users\user\Desktop\folder\1 speech.mp3
C:\Users\user\Desktop\folder\10 speech.mp3
C:\Users\user\Desktop\folder\100 speech.mp3
C:\Users\user\Desktop\folder\101 speech.mp3
C:\Users\user\Desktop\folder\102 speech.mp3
C:\Users\user\Desktop\folder\103 speech.mp3
C:\Users\user\Desktop\folder\104 speech.mp3
C:\Users\user\Desktop\folder\105 speech.mp3
C:\Users\user\Desktop\folder\106 speech.mp3
C:\Users\user\Desktop\folder\107 speech.mp3
C:\Users\user\Desktop\folder\108 speech.mp3
C:\Users\user\Desktop\folder\109 speech.mp3
C:\Users\user\Desktop\folder\11 speech.mp3
不是按日期或大小排序的解决方案。
UPDATE之前的所有答案都非常有效:
l = sorted(glob.glob(f'{os.getcwd()}/*.mp3'), key=len)
l = sorted(glob.glob(f'{os.getcwd()}/*.mp3'), key=lambda x: int(os.path.basename(x).split(' ')[0]))
def get_key(fp):
filename = os.path.splitext(os.path.basename(fp))[0]
int_part = filename.split()[0]
return int(int_part)
l = sorted(glob.glob(f'{os.getcwd()}/*.mp3'), key=get_key)
发布于 2020-07-16 18:42:58
一般的答案是用re.match()
捕获数字,并用int()
将该数字(字符串)转换为整数。使用这些数字对文件进行sorted()
排序
代码
import re
import math
from pathlib import Path
file_pattern = re.compile(r'.*?(\d+).*?')
def get_order(file):
match = file_pattern.match(Path(file).name)
if not match:
return math.inf
return int(match.groups()[0])
sorted_files = sorted(files, key=get_order)
示例输入
考虑使用1整数数字在中的任意文件,文件名的任何部分。
├── 012 some file.mp3
├── 1 file.txt
├── 13 file.mp3
├── 2 another file.txt
├── 3 file.csv
├── 4 file.mp3
├── 6 yet another file.txt
├── 88 name of file.mp3
├── and final 999.txt
├── and some another file7.txt
├── some 5 file.mp3
└── test.py
示例输出
当传递给get_order()
参数中的sorted()
内置函数时,可以使用key
对文件进行排序。
In [1]: sorted(files, key=get_order)
Out[1]:
['C:\\tmp\\file_sort\\1 file.txt',
'C:\\tmp\\file_sort\\2 another file.txt',
'C:\\tmp\\file_sort\\3 file.csv',
'C:\\tmp\\file_sort\\4 file.mp3',
'C:\\tmp\\file_sort\\some 5 file.mp3',
'C:\\tmp\\file_sort\\6 yet another file.txt',
'C:\\tmp\\file_sort\\and some another file7.txt',
'C:\\tmp\\file_sort\\012 some file.mp3',
'C:\\tmp\\file_sort\\13 file.mp3',
'C:\\tmp\\file_sort\\88 name of file.mp3',
'C:\\tmp\\file_sort\\and final 999.txt',
'C:\\tmp\\file_sort\\test.py']
简短解释
re.compile
用于提供一个小的速度提升(如果匹配多次相同的模式)re.match
用于匹配正则表达式模式中的.*?
表示任意字符(.
)、零或多次(*
)非贪婪(?
)。question).groups()
列表。如果没有匹配(文件中没有数字),则match
将是None
,get_order
给出无穷大;这些文件被任意排序,但是可以为这些文件添加逻辑(在此groups()
sorted()
函数中没有要求使用key
参数,应该可以调用该参数:列表中的项)。在本例中,它将是其中一个文件字符串(完整文件路径)Path(file).name
只从完整文件路径获取文件名部分(没有后缀)。发布于 2020-07-16 18:39:24
试试这个:
import glob
import os
files = sorted(glob.glob(f'{os.getcwd()}/*.txt'), key=len)
print(files)
发布于 2020-07-16 18:38:26
看来你是在分裂整个道路,而不是基名。你可以试试这个:
files = sorted(glob.glob(f'{os.getcwd()}/*.mp3'), key=lambda x: int(os.path.basename(x).split(' ')[0]))
https://stackoverflow.com/questions/62941378
复制相似问题