Y4R*_*D13 7 python sorting glob list
我在一个文件夹中有一堆按数字排序的文件,当我尝试对 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...
Run Code Online (Sandbox Code Playgroud)
我尝试过但输出似乎是随机的
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...
Run Code Online (Sandbox Code Playgroud)
尝试按日期或大小排序不是解决方案。
更新 之前的所有答案效果很好:
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
Run Code Online (Sandbox Code Playgroud)
小智 6
尝试这个:
import glob
import os
files = sorted(glob.glob(f'{os.getcwd()}/*.txt'), key=len)
print(files)
Run Code Online (Sandbox Code Playgroud)
一般答案将捕获数字并re.match()使用 将该数字(字符串)转换为整数int()。使用这些数字对文件进行排序sorted()
import re \nimport math\nfrom pathlib import Path \n\nfile_pattern = re.compile(r\'.*?(\\d+).*?\')\ndef get_order(file):\n match = file_pattern.match(Path(file).name)\n if not match:\n return math.inf\n return int(match.groups()[0])\n\nsorted_files = sorted(files, key=get_order)\nRun Code Online (Sandbox Code Playgroud)\n考虑文件名任何部分具有一个整数的随机文件:
\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 012 some file.mp3\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1 file.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 13 file.mp3\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 2 another file.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 3 file.csv\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 4 file.mp3\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 6 yet another file.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 88 name of file.mp3\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 and final 999.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 and some another file7.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 some 5 file.mp3\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.py\nRun Code Online (Sandbox Code Playgroud)\n当传递给参数中的内置函数时,可get_order()用于对文件进行排序sorted()key
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 012 some file.mp3\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 1 file.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 13 file.mp3\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 2 another file.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 3 file.csv\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 4 file.mp3\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 6 yet another file.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 88 name of file.mp3\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 and final 999.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 and some another file7.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 some 5 file.mp3\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.py\nRun Code Online (Sandbox Code Playgroud)\nre.compile提供小的速度提升(如果多次匹配相同的模式)re.match匹配正则表达式patternh.*?表示任何字符 ( .),零次或多次 ( *) 非贪婪 ( ?)。\\d+匹配任何数字一次或多次,括号仅捕获与列表的匹配groups()。match为None,并且get_order给出无穷大;这些文件是任意排序的,但是可以为这些文件添加逻辑(这个问题中没有询问)。sorted()函数接受key参数,该函数应该是可调用的,它接受一个参数:列表中的一项。在这种情况下,它将是这些文件字符串之一(完整文件路径)Path(file).name从完整文件路径中获取文件名部分(不带后缀)。| 归档时间: |
|
| 查看次数: |
9527 次 |
| 最近记录: |