В настоящее время я участвую в курсе 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)
К счастью, я нашел другой способ использования помощи. Тем не менее, я не совсем уверен, как это работает. Может ли кто-нибудь объяснить мне функцию str.maketrans
и каковы первые два пустых аргумента в кавычках? Моя мысль заключается в том, что он говорит: для первых двух символов в имени файла удалите любые числа (от 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()
Мое понимание документации:
static str.maketrans(x[, y[, z]])
Этот статический метод возвращает таблицу перевода, используемую дляstr.translate()
.
Говоря, что аргументы, переданные str.maketrans
, вместе с фактической функцией str.maketrans
, создадут таблицу, в которой говорится: "Если этот символ появляется, замените его на этот символ". Тем не менее, я не уверен, для чего нужны скобки.
Если есть только один аргумент, это должен быть словарь, отображающий Unicode ординалы (целые числа) или символы (строки длиной 1) в Unicode ординалы, строки (произвольной длины) или None. Символьные клавиши будут затем преобразуются в ординалы.
Он говорит, что он может изменять только целые числа или символы в строках длиной один, другим целым числам или строкам (любой длины, которую вы хотите). Но я считаю, что у меня есть три аргумента, а не один.
Если есть два аргумента, они должны быть строками равной длины и в результирующем словаре каждый символ в x будет отображен на символ в том же положении в y. Если есть третий аргумент, должна быть строкой, символы которой будут отображаться в None в результат.
У меня есть три аргумента ('', '', '0123456789')
. Я думаю, что x
является первым ''
, а y
является вторым ''
. У меня есть третий аргумент, который представляет собой строку '0123456789'
, но я не понимаю, что значит быть сопоставленным с 'None'
.