Страницы

Поиск по вопросам

понедельник, 30 марта 2020 г.

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

#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)) ...

Комментариев нет:

Отправить комментарий