如何在扩展前向文件名添加id?

时间:2016-05-27 15:54:19

标签: python

我有一个文件名: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函数的正确方法是什么?

7 个答案:

答案 0 :(得分:19)

我建议简单明了 - 使用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")

答案 1 :(得分:11)

要在一行中执行此操作,您可以尝试:

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

虽然它不是很易读。

大多数框架都提供处理文件名的功能,Python也不例外。您应该使用os.path.splitex

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

尽管如此,我仍然不会在这里找到一个oneliner - 请参阅下一个答案以获得更具可读性的解决方案。

答案 2 :(得分:2)

随机生成你的一行答案 -

map(lambda x :x.split(".")[0] + "_" + hashlib.md5(("%.15f" % time.time())+"_"+''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(5))).hexdigest()[:7]+"."+x.split(".")[1], filenames)

在这里,您可以输入filenames作为列表

刚刚使用了一个随机id生成函数,该函数需要时间和5个字符的随机字符串md5,并从中获取前7个字符。

它不是很易读但是因为你要求一个单行解决方案,我想不出更复杂的方法。

答案 3 :(得分:2)

要修复您的generate_id代码,您需要一个列表理解。

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

您是否仅使用python重命名文件?您可以使用命令行程序,例如pwgen

mv $filename ${filename/%.ext/_$(pwgen 6 1).ext}

如果您要从Python写入文件,请考虑使用tempfile.NamedTemporaryFile和相应的选项。 (delete = False,dir =“。”,prefix =“...”,suffix =“...”)

答案 4 :(得分:2)

def append_id(filename):
    parts = filename.split('.')
    return "".join(parts[:-1])+ '_' + generate_id() + '.' + parts[-1]

答案 5 :(得分:0)

我需要一个简单的版本,将特定的后缀添加到Python程序中的 .txt 文件中,即我需要添加 -VOC,-TEX,或< strong> -RAN 到文件名。例如: filename-VOC.txt (用于词汇文件), filename-TEX.txt (用于纯文本或“ utf8”编码的文件)或 filename-RAN.txt (用于TEX文件的翻译)。因此,我在Jupyter Notebook中尝试了以下解决方案,并且可以正常工作,我得到了想要的结果:

filename = 'C:/Users/User/Desktop/test4.txt'

type(filename) # this is just to check the type of filename, which is a string
t = filename.rsplit('.' 1)
t # this gives me the list ['C:/Users/User/Desktop/test4.txt']

t[0] # this gives me 'C:/Users/User/Desktop/test4', without the '.txt'

# Now I can add the suffix I want to the file name, see below
t2 = t[0]+'-VOC'
t2 # this gives me 'C:/Users/User/Desktop/test4-VOC', which is the desired file name

更具体地说,我将上述内容应用如下:

def new_file():
    """
    Creates vocabulary file
    """
    global file_name

    input_file_name = filedialog.asksaveasfilename(initialdir="/",
    defaultextension='*.txt', filetypes=(("Text Documents", "*.txt"), ("all files", "*.*")))

    if input_file_name:
        file_name = input_file_name.rsplit('.', 1)[0]+'-VOC.txt' # notice this line
        with open(file_name, 'w', encoding='utf-8') as txt_file:
            txt_file.write(text_B.get('1.0', END))

答案 6 :(得分:0)

从Python 3.4开始,pathlib是处理与路径相关的字符串的一个很好的工具。这将路径视为对象而不是字符串,并提供了强大的接口。因此您的功能可以是:

from pathlib import Path

def append_id(filename):
    p = Path(filename)
    return path.with_name(f"{p.stem}_{generate_id()}{p.suffix}")

此函数是通用的,并且还将在完整/相对路径上运行,而不仅仅是文件名:

>>> append_id("sample.text")
PosixPath('sample_PBMQBFD.text')

>>> append_id("/a/b/c/sample.text")
PosixPath('/a/b/c/sample_UMTYXCP.text')

请注意,将返回特定于平台的Path对象。您始终可以使用str()将其转换回字符串。