【问题标题】:Is there any way to retrieve file name using Python? [closed]有没有办法使用 Python 检索文件名? [关闭]
【发布时间】:2019-03-05 10:27:24
【问题描述】:

在 Linux 目录中,我有几个编号的文件,例如“day1”和“day2”。我的目标是编写一个代码,从文件中检索数字并将 1 添加到具有最大数字的文件并创建一个新文件。因此,例如,如果有文件“day1”、“day2”和“day3”,代码应该读取文件列表并添加“day4”。为此,至少我需要知道如何检索文件名上的数字。

【问题讨论】:

  • 查看os 模块。
  • 那么您的问题是如何获取文件名,或者如何从字符串(如文件名)中解析数字?

标签: python linux python-3.x file ubuntu


【解决方案1】:

我会使用os.listdir 来获取所有文件名,删除“day”前缀,将剩余的字符转换为整数,然后取最大值。 从那里开始,只需增加数字并将其附加到相同的前缀:

import os
max_file = max([int(f[3:]) for f in os.listdir('some_directory')])
new_file = 'day' + str(max_file + 1)

【讨论】:

  • 如果需要其他模式,您的代码不可重用。 (3 在这里是一个神奇的数字。)此外,目录可能包含与模式不匹配的文件,但这更多的是额外的。
【解决方案2】:

使用os 模块/包获取所有文件(手边没有确切的命令),然后使用regex(package) 获取数字。如果您不想查看正则表达式,可以使用 replace() 从字符串中删除字母,然后使用 int() 转换该字符串。

【讨论】:

    【解决方案3】:

    Glob 很适合这个。它是一种正则表达式,但专门用于文件搜索并且更简单。基本上你只需使用 * 作为通配符,你也可以选择数字。只需谷歌它到底是什么。它可能非常强大,例如原生于 bash shell。

    for glob import glob
    from pathlib import Path
    
    pattern = "day"
    last_file_number = max(map(lambda f: int(f[len(pattern):]), glob(pattern + "[0-9]*")))
    Path("%s%d" % (pattern, last_file_number + 1)).touch()
    

    你也可以看到我在这里使用了pathlib。这是一个以 OOP 方式处理文件系统的库。有些人喜欢,有些人不喜欢。

    所以,有点免责声明:Glob 不如正则表达式强大。这里daydream 例如不会匹配,但day0dream 仍然会匹配。您也可以尝试day*[0-9],但daydream0 仍然会匹配。当然,如果您知道自己保持在两位数以下,您也可以使用day[0-9]。因此,如果您的用例需要这样做,您可以使用 glob 并使用正则表达式进行过滤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-10
      • 2020-08-31
      • 2015-04-10
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多