首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对glob.glob进行数字排序?

如何对glob.glob进行数字排序?
EN

Stack Overflow用户
提问于 2020-07-16 18:32:22
回答 4查看 5.4K关注 0票数 6

我在文件夹上有一堆数字排序的文件,当我尝试对glob.glob排序时,我从来没有按正确的顺序得到文件。

文件示例和预期输出排序

代码语言:javascript
运行
复制
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...

我尝试了什么,,但是输出看起来是随机的

代码语言:javascript
运行
复制
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之前的所有答案都非常有效:

代码语言:javascript
运行
复制
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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-07-16 18:42:58

一般的答案是用re.match()捕获数字,并用int()将该数字(字符串)转换为整数。使用这些数字对文件进行sorted()排序

代码

代码语言:javascript
运行
复制
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整数数字在中的任意文件,文件名的任何部分。

代码语言:javascript
运行
复制
├── 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对文件进行排序。

代码语言:javascript
运行
复制
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).
  • The将任何数字匹配一次或多次,括号只捕获匹配到groups()列表。如果没有匹配(文件中没有数字),则match将是Noneget_order给出无穷大;这些文件被任意排序,但是可以为这些文件添加逻辑(在此groups() sorted()函数中没有要求使用key参数,应该可以调用该参数:列表中的项)。在本例中,它将是其中一个文件字符串(完整文件路径)
  • Path(file).name只从完整文件路径获取文件名部分(没有后缀)。
票数 4
EN

Stack Overflow用户

发布于 2020-07-16 18:39:24

试试这个:

代码语言:javascript
运行
复制
import glob
import os
files = sorted(glob.glob(f'{os.getcwd()}/*.txt'), key=len)
print(files)
票数 5
EN

Stack Overflow用户

发布于 2020-07-16 18:38:26

看来你是在分裂整个道路,而不是基名。你可以试试这个:

代码语言:javascript
运行
复制
files = sorted(glob.glob(f'{os.getcwd()}/*.mp3'), key=lambda x: int(os.path.basename(x).split(' ')[0]))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62941378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档