从zip文件中读取内容,应用转换并在Python中写入新的zip文件



我有一个zip文件,其中包含一个文本文件(有数百万行(。我需要逐行阅读,对每一行应用一些转换,然后写入一个新文件并压缩它

with zipfile.ZipFile("orginal.zip") as zf, zipfile.ZipFile("new.zip", "w") as new_zip:
    
with io.TextIOWrapper(zf.open("orginal_file.txt"), encoding="UTF-8") as fp, open("new.txt", "w") as new_txt:
        
for line in fp:
                       
new_txt.write(f"{line} - NEW")  # Some transformation
        
new_zip.writestr("new.txt", new_txt)

但我在new_zip.writestr("new.txt", new_txt)中出现以下错误

TypeError: object of type '_io.TextIOWrapper' has no len()
  1. 如果我使用上述方法进行转换,是否会出现内存不足的问题(因为文件可能有数百万行(
  2. 如何识别第一行(因为第一行是标题记录(
  3. 当我使用new_txt.write(f"{line} - NEW")写入时,- NEW在行中位于第一位(例如,如果行是003000000011000000,则输出将是- NEW003000000011000000(
  4. 我们如何确保文件的完整性(例如,确保是否所有行都写在新文件中。(
  5. TypeError: object of type '_io.TextIOWrapper' has no len()错误的原因是什么

谢谢。

当您执行以下操作时:

new_zip.writestr("new.txt", new_txt)

您正试图将对象CCD_ 7作为某些数据(文本或等效数据(写入zip文件作为文件";new.txt";。但是对象new_txt已经是一个文件。这就是出现错误的原因:TypeError: object of type '_io.TextIOWrapper' has no len()——它期望一些内容,但得到一个文件对象。来自文档:

Write a file into the archive. The contents is data, which may be either a str or a bytes instance;

相反,您可能想使用write(file):

new_zip.write("new.txt")

其应当写入文件";new.txt";到zip文件中。

关于您的其他问题:

如果我使用上述方法进行转换,是否会出现内存不足的问题(因为文件可能有数百万行(?

一切都是用文件完成的,所以可能没有。

如何识别第一行(因为第一行是头记录(?

使用在线路循环的第一次迭代中设置的标志

当我使用new_txt.write(f"{line}-new"(进行写入时,-new位于该行的第一位(例如,如果行为003000000011000000,则输出将为-NEW00300000001100000(。

转换逻辑中可能缺少换行n。前面的NEW可能来自你写的前一行。尝试将CCD_ 13添加到转换&请确保在输入字符串的末尾没有现有的换行符。

我们如何确保文件的完整性(例如,确保是否所有行都写在新文件中。(

计算行数?理想情况下,除非出现一些错误,否则所有的行都应该被读取,而不必担心

最新更新