python - python压缩4Gb bz2 EOFError:已找到流的结尾嵌套子文件夹
问题描述
我正在尝试使用 python 从压缩文件 bz2 中读取特定文件。
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.list()' 列出 tar 中的文件,然后再次...
-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 文件,我没有问题,所以我认为文件没有损坏。任何帮助表示赞赏。
解决方案
评论:我尝试了 debug=3 并得到:ReadError: bad checksum
找到以下相关信息:
原因
来自 tar(1) 的此错误消息表明目录的校验和以及它从磁带读取的文件与标头块中通告的校验和不匹配。通常,此消息表示错误的阻塞因素,尽管它可能表示磁带上的数据已损坏。
操作
要解决此问题,请确保您在命令行中指定的阻塞因子(在 -b 之后)与最初指定的阻塞因子相匹配。如果有疑问,请忽略块大小并让 tar(1) 自动确定它。如果该补救措施不起作用,则磁带数据可能已损坏。SE:tar-ignore-or-fix-checksum
我会尝试-i
切换以查看是否可以忽略有关 EOF 的消息。-i, --ignore-zeros ignore zeroed blocks in archive (means EOF)
例子
$ tar xivf backup.tar
bugs.python.org:tarfile-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
模块定义了以下异常: 在打开 tar 存档时引发,该 tarfile 模块无法处理或因某种原因无效。
exception tarfile.ReadError
首先,尝试使用另一个 tar 归档文件来验证您的 python 环境。
其次,检查您的 tar 归档文件是否符合以下格式:
tarfile.DEFAULT_FORMAT
创建档案的默认格式。当前是 GNU_FORMAT。
第三,不要使用tarfile.open(...)
, 来创建tarfile
实例,而是尝试使用以下 , 来设置debug=3
。
tar = tarfile.TarFile(name=filename, debug=3)
tar.open()
...
类 tarfile.TarFile(name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors='surrogateescape', pax_headers=None, 调试=0,错误级别=0)
推荐阅读
- mysql - 我如何从 mysql 查询这些数据?
- java - Java同一个变量在不同的地方有不同的值
- php - 如何检查Mysql中具有逗号分隔值的列中的值?
- c# - 如何使用 .Net 内存分析器报告检查应用程序中是否存在内存泄漏?
- javascript - 在我选择你自己的冒险程序时输入错误意外结束
- flutter - Flutter 如何将 filePath 从 content://media/external/images/media/5275 转换为 /storage/emulated/0/DCIM/Camera/IMG_00124.jpg
- python - 你如何在 Pygame 中清除精灵?
- python - 从本地机器将 Python 连接到 AWS EC2 上的 kafka
- google-app-engine - Daphne on Google App Engine Flexible for Django Channels app: 502 Bad Gateway Error nginx
- amazon-elastic-beanstalk - Django,AWS EB 错误,您的 WSGIPath 引用了一个不存在的文件