【问题标题】:python - get highest number in filenames in a directory [duplicate]python - 获取目录中文件名中的最高数字[重复]
【发布时间】:2019-06-30 04:37:44
【问题描述】:

我正在一个只读文件系统上开发一个延时摄影机,它在 USB 记忆棒上写入图像,没有实时时钟和互联网连接,那么我不能使用 datetime 来维护文件的时间顺序并防止覆盖.

所以我可以将图像存储为1.jpg, 2.jpg, 3.jpg 等等,并在 USB 记忆棒上的文件 last.txt 中更新计数器,但我宁愿避免这样做,我正在尝试计算最后一个文件名启动,但是有9.jpg10.jpg print(max(glob.glob('/home/pi/Desktop/timelapse/*'))) 返回我9.jpg,而且我认为glob 对于数千个文件会很慢,我该如何解决这个问题?

编辑

我找到了这个解决方案:

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 个文件大约需要 3 秒,是否有更快的解决方案将文件分成子文件夹?

【问题讨论】:

  • str(max([int(x.rstrip(".jpg") for x in glob.glob('/home/pi/Desktop/timelapse/*')]))+".jpg" 为每个文件名剥离 .jpg,然后将它们转换为整数,然后找到最大值,然后放回 .jpg。这假设文件名只是整数,它们都是 .jpg 文件,文件夹中除了它们之外没有别的东西。如果你有更宽松的假设,我可以想出更稳健的策略。注意:这绝不是最快或最好的方法
  • 一个目录中的数千个文件总是很慢。我会考虑将文件分隔到不同的目录。也许每次启动都会有新目录?
  • @D_Serg 文件名只是整数,它们都是 .jpg 文件,文件夹中除了它们之外别无其他,最快最好的方法是什么?
  • @AndrejKesely 最好每天制作一个目录但没有时钟我不能,如果订购它为什么会有问题?
  • @Miky,您是否有特定原因避免使用last.txt

标签: python max filenames glob


【解决方案1】:

这里:

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))

【讨论】:

  • 用listdir迭代几千个文件不慢吗?
  • @Miky 如果你觉得它很慢,为什么不将数据拆分到文件夹中,每个文件夹代表一个时间段,比如 10 小时?
  • 如果文件名中有字符,这不起作用。
  • @MarkMoretto 没错,但假设文件名是 1.jpg,2,jpg...n.jpg 所以没有真正的问题。
  • 是的,您的解决方案适用于此。我只是假设 OP 会在某个时候添加字符。实际上,我将帖子更新为仅按创建日期(在 Windows 中)而不是可以更改的数字文件名。
【解决方案2】:

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

比如这样:

from pathlib import Path

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

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

【讨论】:

  • 用glob迭代几千个文件不慢吗?
【解决方案3】:

使用回复:

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)])]

【讨论】:

    【解决方案4】:

    您可以使用os.walk(),因为它会为您提供它找到的文件名列表,然后将您在删除“.jpg”扩展名并将字符串转换为 int 后找到的每个值附加到另一个列表中,然后进行简单的调用最大的将完成这项工作。

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多