如何解释Python 3.6中的str.maketrans函数?

Den*_*nis 31 python string python-3.x

我目前正在参加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()
Run Code Online (Sandbox Code Playgroud)

但是,这在Python 3.x中不起作用,因为它说:

TypeError: translate() takes exactly one argument (2 given)
Run Code Online (Sandbox Code Playgroud)

谢天谢地,我找到了另一种使用某人帮助的方法.但是,我不确定它是如何工作的.有人可以str.maketrans向我解释这个功能,引号中的前两个空白参数是什么?我的想法是它说:对于文件名中的前两个字符,删除任何数字(0到9).那是对的吗?例如,"48athens"如果它们是0到9之间的数字,则删除前两个字符(4和8).

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()
Run Code Online (Sandbox Code Playgroud)

我对文档的理解:

static str.maketrans(x[, y[, z]]) 此静态方法返回可用于的转换表str.translate().

它说的是,传递给的参数str.maketrans以及实际函数str.maketrans将创建一个表格,"如果出现此字符,请将其替换为此字符." 但是,我不确定括号的用途.

如果只有一个参数,则它必须是将Unicode序数(整数)或字符(长度为1的字符串)映射到Unicode序数,字符串(任意长度)或无的字典.然后将字符键转换为序数.

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

如果有两个参数,则它们必须是长度相等的字符串,并且在结果字典中,x中的每个字符将映射到y中相同位置的字符.如果存在第三个参数,则它必须是字符串,其结果中的字符将映射到None.

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

Pat*_*ugh 48

str.maketrans构建一个转换表,它是整数或字符到整数,字符串或的整数映射None.把它想象成一本字典.我们通过字符串来翻译并替换映射中显示为关键字的所有内容,无论其在地图中的值是什么.

您可以使用一个,两个,三个参数构建转换表(我认为这可能会让您感到困惑).有一个论点:

str.maketrans({'a': 'b', 'c': None})
Run Code Online (Sandbox Code Playgroud)

您为函数提供遵循转换表规则的映射,并返回该映射的等效表.映射到的内容将None被删除

有两个参数:

str.maketrans('abc', 'xyz')
Run Code Online (Sandbox Code Playgroud)

你给它两个字符串.第一个字符串中的每个字符都被第二个字符串中该索引处的字符替换.因此'a'映射到'x','b''y''c''z'.

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

str.maketrans('abc', 'xyz', 'hij')
Run Code Online (Sandbox Code Playgroud)

这与两个参数版本相同,只是删除了第三个字符串中的字符,就好像它们被映射到了None.所以你的表说"不要替换任何东西,但删除显示在这个字符串中的字符".


Jim*_*ard 7

从以下文档str.maketrans:

如果有第三个参数,则它必须是一个字符串,其字符将映射到None结果中.

这是str.maketrans在做什么; 它将第三个参数中的每个元素都创建一个映射(Python字典),将字符串中每个字符的序号值映射到None:

>>> str.maketrans('', '', '0123456789') 
{48: None,
 49: None,
 50: None,
 51: None,
 52: None,
 53: None,
 54: None,
 55: None,
 56: None,
 57: None}
Run Code Online (Sandbox Code Playgroud)

如果多余的值作为第一个和第二个参数存在,它们被添加到这个映射,要翻译其他字符(这就是为什么选择作者'''';他不希望额外的字符将被翻译):

>>> str.maketrans('a', 'A', '0123456789') 
{48: None,
 49: None,
 50: None,
 51: None,
 52: None,
 53: None,
 54: None,
 55: None,
 56: None,
 57: None,
 97: 65}   # map ord('a') to ord('A')
Run Code Online (Sandbox Code Playgroud)

如果你申请了此信息字符串现在,它还会利用'athens''Athens',由于额外的'a', 'A'我们提供的maketrans.不是最好的翻译,但足以掌握功能.

str_obj.translate然后str_obj,将使用映射中找到的值替换其值时,对每个字符执行此字典的查找.如果它没有在映射中找到它,它会保持原样,如果它是None删除它.这在文档中说明str.translate:

当由Unicode序数(整数)索引时,表对象可以执行以下任何操作:返回Unicode序号或字符串,以将字符映射到一个或多个其他字符; return None,从返回字符串中删除字符 ; 或者引发LookupError异常,将角色映射到自身.

(强调我的)