сжатый python 4Gb bz2 EOFError: конец потока уже найден, вложенные подпапки - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь прочитать определенный файл из сжатого файла bz2, используя python.

tar = tarfile.open(filename, "r|bz2", bufsize=57860311)

for tarinfo in tar:
    print tarinfo.name, "is", tarinfo.size, "bytes in size and is",
    if tarinfo.isreg():
        print "a regular file."
        # read the file
        f = tar.extractfile(tarinfo)
        #print f.read()
    elif tarinfo.isdir():
        print "a directory."
    else:
        print "something else."
tar.close()

Но в конце я получил ошибку:

/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.pyc in read(self, size)
    577             buf = "".join(t)
    578         else:
--> 579             buf = self._read(size)
    580         self.pos += len(buf)
    581         return buf

/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.pyc in _read(self, size)
    594                 break
    595             try:
--> 596                 buf = self.cmp.decompress(buf)
    597             except IOError:
    598                 raise ReadError("invalid compressed data")

EOFError: end of stream was already found

Я также пыталсявывести список файлов в tar через «tar.list ()» и снова ...

-rwxr-xr-x lindauer/or3uunp          0 2013-05-21 00:58:36 r3.2/
-rw-r--r-- lindauer/or3uunp       6057 2012-01-05 14:41:00 r3.2/readme.txt
-rw-r--r-- lindauer/or3uunp      44732 2012-01-04 10:08:54 r3.2/psychometric.csv
-rw-r--r-- lindauer/or3uunp   57860309 2012-01-04 09:58:20 r3.2/logon.csv

/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tarfile.pyc in _read(self, size)
    594                 break
    595             try:
--> 596                 buf = self.cmp.decompress(buf)
    597             except IOError:
    598                 raise ReadError("invalid compressed data")

EOFError: end of stream was already found

Я перечислил файлы внутри архива с помощью команды tar.Вот результат:

tar -tvf r3.2.tar.bz2
drwxr-xr-x  0 lindauer or3uunp     0 May 21  2013 r3.2/
-rw-r--r--  0 lindauer or3uunp  6057 Jan  5  2012 r3.2/readme.txt
-rw-r--r--  0 lindauer or3uunp 44732 Jan  4  2012 r3.2/psychometric.csv
-rw-r--r--  0 lindauer or3uunp 57860309 Jan  4  2012 r3.2/logon.csv
-rw-r--r--  0 lindauer or3uunp 12494829865 Jan  5  2012 r3.2/http.csv
-rw-r--r--  0 lindauer or3uunp  1066622500 Jan  5  2012 r3.2/email.csv
-rw-r--r--  0 lindauer or3uunp   218962503 Jan  5  2012 r3.2/file.csv
-rw-r--r--  0 lindauer or3uunp    29156988 Jan  4  2012 r3.2/device.csv
drwxr-xr-x  0 lindauer or3uunp           0 May 20  2013 r3.2/LDAP/
-rw-r--r--  0 lindauer or3uunp      140956 Jan  4  2012 r3.2/LDAP/2011-01.csv
-rw-r--r--  0 lindauer or3uunp      147370 Jan  4  2012 r3.2/LDAP/2010-05.csv
-rw-r--r--  0 lindauer or3uunp      149221 Jan  4  2012 r3.2/LDAP/2010-02.csv
-rw-r--r--  0 lindauer or3uunp      141717 Jan  4  2012 r3.2/LDAP/2010-12.csv
-rw-r--r--  0 lindauer or3uunp      148931 Jan  4  2012 r3.2/LDAP/2010-03.csv
-rw-r--r--  0 lindauer or3uunp      147370 Jan  4  2012 r3.2/LDAP/2010-04.csv
-rw-r--r--  0 lindauer or3uunp      149793 Jan  4  2012 r3.2/LDAP/2009-12.csv
-rw-r--r--  0 lindauer or3uunp      143979 Jan  4  2012 r3.2/LDAP/2010-09.csv
-rw-r--r--  0 lindauer or3uunp      145591 Jan  4  2012 r3.2/LDAP/2010-07.csv
-rw-r--r--  0 lindauer or3uunp      139444 Jan  4  2012 r3.2/LDAP/2011-03.csv
-rw-r--r--  0 lindauer or3uunp      142347 Jan  4  2012 r3.2/LDAP/2010-11.csv
-rw-r--r--  0 lindauer or3uunp      138285 Jan  4  2012 r3.2/LDAP/2011-04.csv
-rw-r--r--  0 lindauer or3uunp      149793 Jan  4  2012 r3.2/LDAP/2010-01.csv
-rw-r--r--  0 lindauer or3uunp      146008 Jan  4  2012 r3.2/LDAP/2010-06.csv
-rw-r--r--  0 lindauer or3uunp      144711 Jan  4  2012 r3.2/LDAP/2010-08.csv
-rw-r--r--  0 lindauer or3uunp      137967 Jan  4  2012 r3.2/LDAP/2011-05.csv
-rw-r--r--  0 lindauer or3uunp      140085 Jan  4  2012 r3.2/LDAP/2011-02.csv
-rw-r--r--  0 lindauer or3uunp      143420 Jan  4  2012 r3.2/LDAP/2010-10.csv
-r--r--r--  0 lindauer or3uunp        3923 Jan  4  2012 r3.2/license.txt

Я думаю, это связано с тем, что в архиве есть подпапки, и по каким-то причинам у библиотек python есть проблемы с извлечением подпапок?

Я также пытался открыть файл tar вручную, и у меня нет проблем, поэтому я не думаю, что файл поврежден.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 12 сентября 2018

Комментарий : я попробовал debug = 3, и я получил: ReadError: неверная контрольная сумма

Найдена следующая информация:

tar: ошибка контрольной суммы каталога

Причина
Это сообщение об ошибке от tar (1) указывает, что контрольная сумма каталога и файлов, которые он прочитал с ленты, не соответствует контрольной сумме, объявленной в блоке заголовка. Обычно это сообщение указывает на неправильный коэффициент блокировки, хотя может указывать на поврежденные данные на ленте.
Действие
Чтобы решить эту проблему, убедитесь, что коэффициент блокировки, указанный в командной строке (после -b), соответствует первоначально указанному коэффициенту блокировки. Если вы сомневаетесь, оставьте размер блока и позвольте tar (1) определить его автоматически. Если это средство не поможет, данные на ленте могут быть повреждены.

SE: Тар-игнорируемые или затруднительная-контрольная сумма
Я бы попробовал переключатель -i, чтобы посмотреть, можете ли вы просто игнорировать и сообщения, касающиеся EOF

 -i, --ignore-zeros         ignore zeroed blocks in archive (means EOF)

Пример

 $ tar xivf backup.tar

bugs.python.org: headererror-файл обработан
Комментарий в tarfile.py гласит (Не знаю дату файла!):

-           # We shouldn't rely on this checksum, because some tar programs
-           # calculate it differently and it is merely validating the
-           # header block.

ReadError: неожиданный конец данных


Из документации tarfile

Модуль tarfile определяет следующие исключения:
exception tarfile.ReadError
Возникает при открытии архива tar, который либо не может быть обработан модулем tarfile, либо неверен.

Сначала попробуйте с другим архивным файлом tar проверить вашу среду Python .
Во-вторых, проверьте, соответствует ли ваш архивный файл tar следующему формату :

tarfile.DEFAULT_FORMAT

Формат по умолчанию для создания архивов. В настоящее время это GNU_FORMAT.

В-третьих, вместо использования tarfile.open(...) для создания экземпляра tarfile, попробуйте использовать следующее, чтобы установить debug=3.

tar = tarfile.TarFile(name=filename, debug=3)
tar.open()
...

class tarfile.TarFile (name = Нет, mode = 'r', fileobj = Нет, format = DEFAULT_FORMAT, tarinfo = TarInfo, разыменование = False, ignore_zeros = False, кодировка = ENCODING, ошибки = 'surrogateescape', pax_headers = Нет, debug = 0, errorlevel = 0)

...