如何在扩展名前为文件名添加一个 id?

新手上路,请多包涵

我有一个文件名:name.ext

我想做以下事情:

 name + id + '.' + ext for name, ext in filename.split()

或者找到一种更好的方法来获取文件名并在扩展名之前的末尾添加一个随机的 7 个字符的字符串。

这是我到目前为止所拥有的:

 def generate_id(size=7, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

def append_id(filename):
    return (name + '_' + generate_id() + '.' + ext for name, ext in filename.split('.'))

但它将其视为生成器表达式,这不是我想要的结果。

编写 append_id 函数的正确方法是什么?

原文由 ss7 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 544
2 个回答

要在一行中完成,您可以尝试:

 def append_id(filename):
    return "{0}_{2}.{1}".format(*filename.rsplit('.', 1) + [generate_id()])

不过,它的可读性不是很好。

大多数语言实现都提供了处理文件名的函数,Python 也不例外。你应该使用 os.path.splitext

 def append_id(filename):
  return "{0}_{2}{1}".format(*os.path.splitext(filename) + (generate_id(),))

请注意,第二个版本需要两个额外的修改:

  • splitext 返回一个元组而不是列表,所以我们需要用一个元组包装 generate_id 的结果
  • splitext 保留点,所以你需要从格式字符串中删除它

尽管如此,我还是不会为在这里拥有一个单行而苦苦挣扎 - 请参阅下一个答案以获取更具可读性的解决方案。

Python 3.4 引入了 pathlib 模块,您可以像这样使用它:

 from pathlib import Path

def append_id(filename):
  p = Path(filename)
  return "{0}_{2}{1}".format(p.stem, p.suffix, generate_id())

这仅适用于没有前面路径的文件名。对于具有路径的文件,请使用:

 from pathlib import Path

def append_id(filename):
  p = Path(filename)
  return "{0}_{2}{1}".format(Path.joinpath(p.parent, p.stem), p.suffix, generate_id())

在 Python 3.9 中还有 with_stem ,这可能是最适合这种情况的选择。

原文由 BartoszKP 发布,翻译遵循 CC BY-SA 4.0 许可协议

我建议一些简单明了的方法——使用 os.path.splitext 来检索基本名称和扩展名,然后通过 str.format 方法简单合并所有结果组件。

 import os
import random
import string

def generate_id(size=7, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

def append_id(filename):
    name, ext = os.path.splitext(filename)
    return "{name}_{uid}{ext}".format(name=name, uid=generate_id(), ext=ext)

一些测试用例:

 append_id("hello.txt")
append_id("hello")
append_id("multiple.dots.in.file")

原文由 Łukasz Rogalski 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题