python: ошибка извлечения tarfile IOError: [Errno 22] недопустимый режим («wb») или имя файла

Я извлекаю файл, используя tarfile. К сожалению, этот сжатый файл поступил с сервера Linux и содержит несколько файлов, содержащих недопустимые символы ОС Windows для файлов (':').

Я использую ниже:

extract = tarfile.open(file)
extract.extractall(path=new_path)
extract.close()

Я получаю следующую ошибку: IOError: [Errno 22] недопустимый режим ('wb') или имя файла: ... "file::ext"

Итак, я попытался передать ошибку с помощью:

try:
    extract = tarfile.open(file)
    extract.extractall(path=new_path)
    extract.close()
except IOError:
    pass

Это работает, однако извлечение не продолжается. Это просто останавливается с этой неудачей.

Когда я распаковываю архив WinRAR, файл автоматически переименовывается в «file__ext».

Есть ли расширение WinRAR для Python? Или, может быть, способ пропустить ошибку и продолжить извлечение? Или автоматически переименовать файл, как это делает WinRAR. Я не возражаю, если файл будет пропущен.

Я видел несколько сообщений с этой ошибкой, однако все они были для сжатия, а не для извлечения.


person Derorrist    schedule 17.05.2015    source источник
comment
Ваше имя файла содержит двоеточие?   -  person Ajay    schedule 17.05.2015
comment
Сам сжатый файл, нет. Несколько файлов внутри файла, да.   -  person Derorrist    schedule 17.05.2015


Ответы (2)


extract = tarfile.open(file)
for f in extract:
    # add other unsavory characters in the brackets
    f.name = re.sub(r'[:]', '_', f.name)
extract.extractall(path=new_path)
extract.close()

(Изменения не будут сохранены в исходном файле, потому что мы открываем его в режиме чтения по умолчанию.)

person Brian Lee    schedule 17.05.2015
comment
По причине, которую я не могу определить, ваш ответ не работает. Однако это привело меня к правильному пути в разрешении, поэтому я отметил его как решение. В конце концов я использовал maketrans() и f.name = f.name.translate() из библиотеки строк вместо регулярного выражения. Спасибо! - person Derorrist; 17.05.2015
comment
Странный. Я тестировал его как в Python 2, так и в 3. Рад, что вы нашли свое решение! - person Brian Lee; 17.05.2015

Если основной целью является пакетное выполнение этих заданий, вы можете просто вызвать winRAR из командной строки:

import subprocess
subprocess.call(['winRAR.exe', 'x', 'file.rar', 'PathToExtractTo'], shell=True)

Я не тестировал приведенный выше код, но, надеюсь, он дает некоторые идеи.

person chaps    schedule 17.05.2015