#python
Есть папка с файлами, нужно удалить все цифры в названиях файлов. Из примера все должно работать. Но у меня выкидывает ошибку. Если бы это можно было исправить- жизнь стала бы прекрасна. Добавил 2 строчки, поправил, import os def rename_files(): #1 file_list=os.listdir(r"C:\Users\Public\Documents\Python Scripts\prank\prank") #print(file_list) saved_path=os.getcwd() print("Current Workint Directory is"+ saved_path) os.chdir(r"C:\Users\Public\Documents\Python Scripts\prank\prank") #2 for file_name in file_list: print("old name"+ file_name) print("New name"+ file_name.translate(None,"0123456789")) os.rename(file_name,file_name.translate(None,"0123456789")) os.chdir(saved_path) rename_files() TypeError: translate() takes exactly one argument (2 given)
Ответы
Ответ 1
bytes.translate и unicode.translate методы имеют разный интерфейс. В зависимости от версии Питона [тип str] и наличия from __future__ import unicode_literals обычные строковые константы типа 'abc' могут быть либо байтами либо Unicode. Код у вас написан, используя bytes.translate интерфейс, но 'abc' это Юникодная строка на Питоне 3 и поэтому несовместимая Юникодная версия translate метода вызывается — запуская Питон 2 код на Питон 3, вы получаете TypeError ошибку здесь. Используйте Unicode пути на Windows (объяснение почему см. в Как работать с путями c русскими символами?), тогда [в виде бонуса] код будет и на Питоне 2 так и 3 работать: remove_digits_table = dict.fromkeys(map(ord, u"0123456789")) no_digits = [name.translate(remove_digits_table) for name in os.listdir(u'C:\\Users\\name\\folder')] Если передать в os.listdir() Unicode, то и результат будет список Unicode имён, поэтому Юникодная версия translate() метода на обоих версиях вызывается, которая принимает словарь: номер символа -> строка на что заменить или None, чтобы удалить символ: >>> dict.fromkeys([1, 2, 3]) {1: None, 2: None, 3: None} Если не нужно Питон 2 поддерживать, то удобно pathlib модулем воспользоваться: #!/usr/bin/env python3 import string from pathlib import Path remove_digits_table = dict.fromkeys(map(ord, string.digits)) for path in Path(r'C:\Users\name\folder').iterdir(): path.replace(path.with_name(path.name.translate(remove_digits_table))) Здесь нет os.chdir() функции, которую стоит избегать, так как она затрудняет чтение кода и/или может препятствовать выполнению нескольких вещей одновременно в более крупных скриптах.Ответ 2
Пример написан для Python2, а вы запускаете на Python3, поэтому и не работает. table = str.maketrans('', '', '0123456789') for file_name in file_list: ... print('New name' + file_name.translate(table)) ...
Комментариев нет:
Отправить комментарий