使用 'tarfile' 时跳过损坏的存档 (.tar.gz)
Skip broken archives (.tar.gz) when using 'tarfile'
我在一个文件夹中有 100 多个 .tar.gz 个文件。其中一些文件已损坏。
我正在尝试提取所有这些。如果文件损坏,我想跳过该存档并移至下一个文件。另外,如果可能的话,最后我想要一个提取失败的档案列表。
import os
import tarfile
files = os.listdir('G:\A')
for file in files:
id = file.split('.')
with tarfile.open('G:\A\' + file,'r:gz') as tar:
tar.extractall(path='G:\A\Extracted\' + id[0])
循环按预期进行,但是当它遇到损坏的存档时会给出错误:"Compressed file ended before the end-of-stream marker was reached"
编辑:
根据 ILI 评论,我尝试了以下操作,但遇到了同样的错误。
BLOCK_SIZE = 1024
for file in files:
with tarfile.open('G:\Sat Img\' + file) as tardude:
for member in tardude.getmembers():
with tardude.extractfile(member.name) as target:
for chunk in iter(lambda: target.read(BLOCK_SIZE), b''):
pass
如果我对你的问题的理解正确,你可能正在寻找这样的修改:
import os
import tarfile
files = os.listdir('G:\A')
for file in files:
id = file.split('.')
try:
with tarfile.open('G:\A\' + file,'r:gz') as tar:
tar.extractall(path='G:\A\Extracted\' + id[0])
except tarfile.ReadError: # reading tarfile failed
continue # move on to the next one
不确定您的文件是如何损坏的以及您会看到什么样的错误,因此您可能需要捕获不同的异常。
我在一个文件夹中有 100 多个 .tar.gz 个文件。其中一些文件已损坏。
我正在尝试提取所有这些。如果文件损坏,我想跳过该存档并移至下一个文件。另外,如果可能的话,最后我想要一个提取失败的档案列表。
import os
import tarfile
files = os.listdir('G:\A')
for file in files:
id = file.split('.')
with tarfile.open('G:\A\' + file,'r:gz') as tar:
tar.extractall(path='G:\A\Extracted\' + id[0])
循环按预期进行,但是当它遇到损坏的存档时会给出错误:"Compressed file ended before the end-of-stream marker was reached"
编辑: 根据 ILI 评论,我尝试了以下操作,但遇到了同样的错误。
BLOCK_SIZE = 1024
for file in files:
with tarfile.open('G:\Sat Img\' + file) as tardude:
for member in tardude.getmembers():
with tardude.extractfile(member.name) as target:
for chunk in iter(lambda: target.read(BLOCK_SIZE), b''):
pass
如果我对你的问题的理解正确,你可能正在寻找这样的修改:
import os
import tarfile
files = os.listdir('G:\A')
for file in files:
id = file.split('.')
try:
with tarfile.open('G:\A\' + file,'r:gz') as tar:
tar.extractall(path='G:\A\Extracted\' + id[0])
except tarfile.ReadError: # reading tarfile failed
continue # move on to the next one
不确定您的文件是如何损坏的以及您会看到什么样的错误,因此您可能需要捕获不同的异常。