Первая программа Python - несколько ошибок - PullRequest
2 голосов
/ 19 января 2010

Я пытаюсь написать программу на python, которая в конечном итоге примет аргумент командной строки файла, определит, является ли он файлом tar или zip и т. Д., А затем извлечет его соответствующим образом. Я просто пытаюсь заставить работать часть tar и получаю несколько ошибок. Файл, который я проверяю, находится в моей директории ~ /. Любые идеи были бы великолепны.

#!/usr/bin/python

import tarfile
import os

def open_tar(file):
    if tarfile.is_tarfile(file):
        try:
            tar = tarfile.open("file")
            tar.extractall()
            tar.close()
        except ReadError:
            print "File is somehow invalid or can not be handled by tarfile"
        except CompressionError:
            print "Compression method is not supported or data cannot be decoded"
        except StreamError:
            print "Is raised for the limitations that are typical for stream-like TarFile objects."
        except ExtractError:
            print "Is raised for non-fatal errors when using TarFile.extract(), but only if TarFile.errorlevel== 2."

if __name__ == '__main__':
    file = "xampp-linux-1.7.3a.tar.gz"
    print os.getcwd()
    print file
    open_tar(file)

Вот ошибки. Если я закомментирую «Ошибка чтения», я получу ту же ошибку и в следующем исключении.

tux@crosnet:~$ python openall.py
/home/tux
xampp-linux-1.7.3a.tar.gz
Traceback (most recent call last):
  File "openall.py", line 25, in <module>
    open_tar(file)
  File "openall.py", line 12, in open_tar
    except ReadError:
NameError: global name 'ReadError' is not defined
tux@crosnet:~$ 

Ответы [ 4 ]

10 голосов
/ 19 января 2010

Вы можете ясно увидеть в вашей ошибке, что она

NameError: global name 'ReadError' is not defined

ReadError не является глобальным именем Python. Если вы посмотрите документацию tarfile , вы увидите, что ReadError является частью исключений этих модулей. Так что в этом случае вы хотели бы сделать:

except tarfile.ReadError:
  # rest of your code

И вам нужно будет сделать то же самое для остальных этих ошибок. Кроме того, если все эти ошибки приведут к одному и тому же результату (какое-либо сообщение об ошибке или пропуск), вы можете просто сделать:

except (tarfile.ReadError, tarfile.StreamError) # and so on

Вместо того, чтобы делать их каждый на отдельной линии. Это только если они дадут одно и то же исключение

2 голосов
/ 19 января 2010

Вы должны будете использовать except tarfile.ReadError или альтернативно использовать from tarfile import is_tarfile, open, ReadError, CompressionError, etc. и поместить это в функцию open_tar вместо глобально.

1 голос
/ 19 января 2010

Хорошо. Все ваши исключения (ReadError, CompressionError и т. Д.) Находятся внутри модуля tarfile, поэтому вам нужно будет сказать except tarfile.ReadError вместо except ReadError.

1 голос
/ 19 января 2010

Я думаю, вам может понадобиться tarfile.ReadError, а не только ReadError?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...