2015-05-17 3 views
0

Я извлекаю файл, используя tarfile. К сожалению, этот сжатый файл поступает с сервера linux и содержит несколько файлов, содержащих недопустимые символы ОС Windows для файлов (':').python: ошибка извлечения tarfile IOError: [Errno 22] неверный режим ('wb') или имя файла

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

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

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

Так что я попытался пропусканием ошибки с:

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

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

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

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

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

+0

ваше имя файла содержит ли двоеточие? – Ajay

+0

Сам сжатый файл, нет. Да, несколько файлов внутри файла. – Derorrist

ответ

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() 

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

+0

По какой-то причине я не могу определить, ваш ответ не работает. Однако это привело меня к правильному пути в разрешении, поэтому я обозначил его как решение. В итоге я использовал maketrans() и f.name = f.name.translate() из строковой библиотеки вместо регулярного выражения. Благодаря! – Derorrist

+1

Нечетный. Я тестировал его как на python 2, так и на 3. Рад, что вы нашли свое решение! –

0

Если главная цель состоит в том, чтобы эти рабочие партии, вы можете просто позвонить WinRar из командной строки:

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

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

Смежные вопросы