我目前正在参加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()
但是,这在Python 3.x中不起作用,因为它说:
TypeError: translate() takes exactly one argument (2 given)
值得庆幸的是,我找到了另一种方式使用某人's assistance. However, I'我不确定它是如何工作的 . 有人可以向我解释 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()
My Understanding of the Documentation:
static str.maketrans(x [,y [,z]])此静态方法返回可用于str.translate()的转换表 .
它说传递给 str.maketrans 的参数以及实际的函数 str.maketrans 会产生一个表格,但是,我不确定括号的含义 .
如果只有一个参数,则它必须是将Unicode序数(整数)或字符(长度为1的字符串)映射到Unicode序数,字符串(任意长度)或无的字典 . 然后将字符键转换为序数 .
它说它只能将整数或长度为1的字符串中的字符更改为其他整数或字符串(任意长度) . 但我相信我有三个论点,而不是一个 .
如果有两个参数,它们必须是长度相等的字符串,并且在结果字典中,x中的每个字符将映射到y中相同位置的字符 . 如果有第三个参数,则它必须是一个字符串,其结果中的字符将映射到None .
我有三个参数 ('', '', '0123456789') . 我认为 x 是第一个 '' , y 是第二个 '' . 我有第三个参数,它是一个字符串 '0123456789' ,但我不明白映射到 'None' 意味着什么 .