在python 3中将字符串保存到tarfile会导致意外的数据结束错误

问题描述 投票:0回答:1

我正在尝试打开一个充满json数据的tar.gz文件,从中提取文本,并将它们保存回tar.gz.到目前为止,这是我在Python 3中的代码。

from get_clean_text import get_cleaned_text # my own module
import tarfile
import os
import json
from io import StringIO
from pathlib import Path


def make_clean_gzip(inzip):
    outzip = "extracted/clean-" + inzip
    with tarfile.open(inzip, 'r:gz') as infile, tarfile.open(outzip, 'w:gz') as outfile:
        jfiles = infile.getnames()
        for j in jfiles:
            dirtycase = json.loads(infile.extractfile(j).read().decode("utf-8"))
            cleaned = get_cleaned_text(dirtycase)
            newtarfile = tarfile.TarInfo(Path(j).stem + ".txt")
            fobj = StringIO()
            fobj.write(cleaned)
            newtarfile.size = fobj.tell()
            outfile.addfile(newtarfile, fobj)

然而,这引发了OSError: unexpected end of data。 (顺便说一下,我已经验证了我想写的所有字符串都是非零长度,并且还验证了在文件对象上调用tell()返回的值与调用字符串上的len()相同。)

我发现this prior SO,这表明问题是StringIO没有编码,所以我换掉了BytesIO for StringIO然后fobj.write(cleaned.encode("utf-8")),但这仍然会抛出相同的错误。

我也尝试过不在TarInfo对象上设置大小,并且该代码已经运行,但是创建了一个包含大量空文件的存档。

我错过了什么?谢谢!

python string python-3.x gzip tar
1个回答
2
投票

.addfile()方法可能只是在你给它的文件对象上调用.read() - 在这种情况下它不返回任何内容,因为你已经在文件的末尾。尝试在该行之前添加fobj.seek(0)

© www.soinside.com 2019 - 2024. All rights reserved.