2010-01-19 5 views
2

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

#!/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) 

Вот ошибки. ЕСЛИ я прокомментирую ошибку чтения, я просто получаю такую ​​же ошибку и в следующем исключении.

[email protected]:~$ 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 
[email protected]:~$ 
+0

Ну, это действительно очень тяжело для нас читать. Не могли бы вы взглянуть на подсказки форматирования в правой части страницы? Не могли бы вы использовать кнопку «101010» для правильного форматирования ваших сообщений и сообщений о трассировке? Если мы не сможем прочитать ваш вопрос, мы не можем помочь. –

+0

Я пытаюсь, у меня это в блоках. Я вижу, что все это испортилось. – Justin

+0

Чтобы форматировать текст как код переполнения стека, префикс всех строк с четырьмя пробелами, вот и все, не нужно окружать текст любыми тегами. Нажмите «Редактировать» в сообщении, чтобы узнать, как я изменил форматирование. Также есть удобная кнопка на панели инструментов, которую вы можете использовать, если вы выберете текст и горячую клавишу Ctrl + K. –

ответ

10

Вы можете ясно видеть в своей ошибке говорится

NameError: global name 'ReadError' is not defined 

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

except tarfile.ReadError: 
    # rest of your code 

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

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

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

+0

Хорошо, спасибо. Я знал, что это говорит о том, что это было неопределенным, я был уверен, что мне нужно было прикрепить. Благодарю. – Justin

+0

Добавление, которое остановило ошибки. Другая ошибка заключалась в том, что у меня была переменная с именем, указанная один раз, когда мне не нужно было это делать. – Justin

1

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

1

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

2

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

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