我有一个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()
- 如果我使用上述方法进行转换,是否会出现内存不足的问题(因为文件可能有数百万行(
- 如何识别第一行(因为第一行是标题记录(
- 当我使用
new_txt.write(f"{line} - NEW")
写入时,- NEW
在行中位于第一位(例如,如果行是003000000011000000
,则输出将是- NEW003000000011000000
( - 我们如何确保文件的完整性(例如,确保是否所有行都写在新文件中。(
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添加到转换&请确保在输入字符串的末尾没有现有的换行符。
我们如何确保文件的完整性(例如,确保是否所有行都写在新文件中。(
计算行数?理想情况下,除非出现一些错误,否则所有的行都应该被读取,而不必担心