python-在目录中的文件名中获得最高编号

时间:2019-06-29 16:29:34

标签: python max filenames glob

我正在一个只读文件系统上开发一个缩时摄影机,该摄影机将图像写在USB记忆棒上,没有实时时钟和互联网连接,所以我无法使用日期时间来维护文件的时间顺序并防止覆盖

因此,我可以将图像存储为1.jpg, 2.jpg, 3.jpg,依此类推,然后将计数器更新到USB记忆棒上的文件last.txt中,但我宁愿避免这样做,而是尝试计算最后一个在启动时使用文件名,但是拥有9.jpg10.jpg print(max(glob.glob('/home/pi/Desktop/timelapse/*')))的情况下,我将返回9.jpg,我还认为glob会随着成千上万个文件而变慢,该如何解决? / p>

编辑

我找到了这个解决方案:

import glob
import os
import ntpath
max=0
for name in glob.glob('/home/pi/Desktop/timelapse/*.jpg'):
    n=int(os.path.splitext(ntpath.basename(name))[0])
    if n>max:
        max=n
print(max)

但是每10.000个文件大约需要3s,是否有更快的解决方案将文件分为子文件夹?

4 个答案:

答案 0 :(得分:0)

这里:

latest_file_index = max([int(f[:f.index('.')]) for f in os.listdir('path_to_folder_goes_here')])

另一种想法是只使用文件列表的长度(假设文件夹中的所有文件都是jpg文件)

latest_file_index = len(os.listdir(dir))

答案 1 :(得分:0)

您需要从文件名中提取数字并将其转换为整数以获得正确的数字顺序。

例如这样的

from pathlib import Path

folder = Path('/home/pi/Desktop/timelapse')
highest = max(int(file.stem) for file in folder.glob('*.jpg'))

对于更复杂的文件名模式,可以使用正则表达式扩展此方法。

答案 2 :(得分:0)

使用re:

import re

filenames = [
    'file1.jpg',
    'file2.jpg',
    'file3.jpg',
    'file4.jpg',
    'fileA.jpg',
    ]

### We'll match on a general pattern of any character before a number + '.jpg'
### Then, we'll look for a file with that number in its name and return the result
### Note: We're grouping the number with parenthesis, so we have to extract that with each iteration.
### We also skip over non-matching results with teh conditional 'if'
### Since a list is returned, we can unpack that by calling index zero.
max_file = [file for file in filenames if max([re.match(r'.*(\d+)\.jpg', i).group(1) for i in filenames if re.match(r'.*(\d+)\.jpg', i)]) in file][0]

print(f'The file with the maximum number is: {max_file}')

输出:

The file with the maximum number is: file4.jpg

注意:无论文件名中的数字前是否有字母,这都可以使用,因此您可以随意命名文件(差不多)。

*第二个解决方案:使用创建日期。 *

这与第一个类似,但是我们将使用os模块并迭代目录,并返回具有最新创建日期的文件:

import os

_dir = r'C:\...\...'

max_file = [x for x in os.listdir(_dir) if os.path.getctime(os.path.join(_dir, x)) == max([os.path.getctime(os.path.join(_dir, i)) for i in os.listdir(_dir)])]

答案 3 :(得分:0)

您可以使用os.walk(),因为它会为您提供找到的文件名列表,然后在删除'.jpg'扩展名并将字符串强制转换为int之后,将找到的每个值附加到另一个列表中。只需调用max即可完成工作。

import os

# taken from https://stackoverflow.com/questions/3207219/how-do-i-list-all-files-of-a-directory
_, _, filenames = next(os.walk(os.getcwd()), (None, None, []))
values = []

for filename in filenames:
    try:
        values.append(int(filename.lower().replace('.jpg','')))
    except ValueError:
        pass  # not a file with format x.jpg

max_value = max(values)