我目前正在参加Udacity课程,该课程指导学生使用Python编程.其中一个项目要求学生重命名目录中的照片文件(删除名称中的任何数字),以便按字母顺序排列这些文件,之后将拼写出一条秘密消息.例如,如果一个文件名是"48athens",程序会删除这些数字,只留下"athens"作为文件名.

我使用的是Python 3.6,而课程讲师使用的是Python 2.7.我应该使用Python 2.7来简化学习过程.不过,目前我将继续使用Python 3.6.

讲师重命名文件的方式是使用.translate函数,该函数在Python 2中接受两个参数.x、 而Python 3.x只接受一个参数.它会从文件名中删除任何数字(0到9).

import os

def rename_files(): #Obtain the file names from a folder.
    file_list = os.listdir(r"C:\Users\Dennis\Desktop\OOP\prank\prank")
    print (file_list)
    saved_path = os.getcwd()
    os.chdir(r"C:\Users\Dennis\Desktop\OOP\prank\prank")
    for file_name in file_list: #Rename the files inside of the folder.
        os.rename(file_name, file_name.translate(None, "0123456789"))
    os.chdir(saved_path)

rename_files()

然而,这在Python3中不起作用.x、 正如上面所说:

TypeError: translate() takes exactly one argument (2 given)

谢天谢地,我找到了另一种利用他人帮助的方法.然而,我并不确定它是如何工作的.有人能给我解释一下str.maketrans函数吗?引号中的前两个空白参数是用来做什么的?我的 idea 是,它的意思是:对于文件名中的前两个字符,删除任何数字(0到9).对吗?例如,在"48athens"中,如果前两个字符(4和8)是介于0和9之间的数字,请删除它们.

import os

def rename_files(): #Obtain the file names from a folder.
    file_list = os.listdir(r"C:\Users\Dennis\Desktop\OOP\prank\prank")
    print (file_list)
    saved_path = os.getcwd()
    os.chdir(r"C:\Users\Dennis\Desktop\OOP\prank\prank")
    for file_name in file_list: #Rename the files inside of the folder.
        os.rename(file_name, file_name.translate(str.maketrans('','','0123456789')))
    os.chdir(saved_path)

rename_files()

My Understanding of the Documentation:

static str.maketrans(x[, y[, z]])

它的意思是,传递给str.maketrans的参数,以及实际的函数str.maketrans,将生成一个表,上面写着,"如果出现这个字符,用这个字符替换它."然而,我不确定括号是用来做什么的.

如果只有一个参数,那么它必须是映射Unicode的字典

这意味着它只能将整数或长度为1的字符串中的字符更改为其他整数或字符串(任意长度).但我相信我有三个论点,而不是一个.

如果有两个参数,它们必须是长度相等的字符串,并且

我有三个论点.我认为x是第一个''y是第二个''.我有第三个参数,是字符串'0123456789',但我不明白映射到'None'意味着什么.

推荐答案

str.maketrans构建一个转换表,它是整数或字符到整数、字符串或None的映射.把它想象成一个字典,其中键代表输入字符串中的字符,它们映射的值代表输出字符串中的字符.

我们通过字符串来转换和替换映射中作为键出现的所有内容,无论其在映射中的值是什么,如果该值为None,则将其删除.

你可以用一个、两个或三个参数建立一个翻译表(我想这可能是让你困惑的地方).有一个理由:

str.maketrans({'a': 'b', 'c': None})

给函数一个遵循转换表规则的映射,它会为该映射返回一个等价的表.映射到None的内容将被删除

有两个理由:

str.maketrans('abc', 'xyz')

你给它两条线.第一个字符串中的每个字符都将替换为第二个字符串中该索引处的字符.所以'a'张 map 对应'x'张,'b'张对应'y'张,'c'张对应'z'张.

你正在使用的一个,有三个参数,工作原理与两个参数相同,但有第三个字符串.

str.maketrans('abc', 'xyz', 'hij')

这与双参数版本相同,只是第三个字符串中的字符被删除,就像它们被映射到None一样.因此,您的表显示"不要替换任何内容,而是删除此字符串中显示的字符".

Python-3.x相关问答推荐

DuckDB:带有嵌套对象的星形表达式

将strid()映射到Pandas DataFrame中的字符串不会更改NaN条目,但仍然声称它们不同?

十进制浮点数到整型的转换错误

从PYTHON中获取单行和多行的Rguar表达式

Pandas -我们如何在一行中应用多个要求

使用Python抓取sofascore以获取有关球队阵容和投票的信息

命名空间前缀无效

基于Pandas列动态创建分箱,以使观测值数量或计数占总计数的1%.

为什么 mypy 不适用于 sqlalchemy?

根据另一个数据帧中的位置从主数据帧中提取子序列

Python ** 用于负数

从 h264 帧解析数据包时 PyAV 不一致

将字符串表示与使用整数值的枚举相关联?

使用 python 正则表达式匹配日期

在 Python 3 中使用 unittest.mock 修补 input()

如何调试垂死的 Jupyter Python3 内核?

Python 3.4 多处理队列比 Pipe 快,出乎意料

尾部斜杠的 FastAPI 重定向返回非 ssl 链接

哪个更有效:Python 文档字符串还是类型提示?

为什么某些代码在 Python2 中是确定性的,而在 Python 3 中是非确定性的?