在python中读/写txt文件后文件大小发生变化
Posted
技术标签:
【中文标题】在python中读/写txt文件后文件大小发生变化【英文标题】:File size changes after read/write txt file in python 【发布时间】:2018-03-14 09:27:48 【问题描述】:在使用 Python 执行以下代码生成文本文件的副本后,newfile.txt
的文件大小与 oldfile.txt
的文件大小不同。
with open('oldfile.txt','r') as a, open('newfile.txt','w') as b:
content = a.read()
b.write(content)
虽然 oldfile.txt
有例如667 KB,newfile.txt
有 681 KB。
有人对此有解释吗?
【问题讨论】:
您很难检查两个文件的差异吗?有一些工具可以做到这一点。 (但我猜你可能会发现它与行尾有关。) When to open file in binary mode (b)? 回答了这个问题,“文本”模式的解释比这里的答案更长。 你是 Windows 用户,对吧? 是的,我在 Windows 中生成了 oldfile.txt。它的换行符是\r\n
,而newfile.txt 中的换行符是\n
。我明白了,以二进制模式打开文件 with open('oldfile.txt', 'rb') as a, open('newfile.txt', 'wb') as b:
... 会保留换行符。
【参考方案1】:
有多种原因。
您正在将文件作为文本文件打开,因此文件的字节被解释(解码)为 python,然后被编码。所以可能会有变化。
来自open
文档 (https://docs.python.org/3/library/functions.html#open):
从流中读取输入时,如果换行符为 None,则启用通用换行符模式。输入中的行可以以 '\n'、'\r' 或 '\r\n' 结尾,这些行在返回给调用者之前会被翻译成 '\n'。
因此,如果原始文件是 ASCII(例如在 Windows 中生成),您将删除 \r
。但是在写回文件时,您将不再拥有原始的\r
(如果您在 Linux 或 MacOs 中),或者您将始终拥有\r\n
,如果您在 Windows 上(似乎是这样,因为您的文件增加了大小)。
编码也可以改变文本。例如。 BOM 标记可以被删除(或添加),并且可能(但 AFAIK 并没有隐式完成),不需要的代码可以被删除(你可以在 Unicode 中有一些额外的代码,这会改变附近代码的行为。可以添加更多其中之一,但只有最后一个有效。
【讨论】:
真的,谢谢。当我以二进制模式读/写时,文件内容保持不变。【参考方案2】:我在 Linux / Ubuntu 上试过。它按预期工作,两个文件的文件大小完全相等。
在这一点上,我猜这种行为与 python 无关,可能取决于你的文件系统(压缩)或操作系统。
【讨论】:
一个测试是确定的,只要它证明它是错误的。您尚未测试所有案例。以上是关于在python中读/写txt文件后文件大小发生变化的主要内容,如果未能解决你的问题,请参考以下文章
storm问题记录 python 不断向kafka中写消息,spout做为消费者从kafka中读消息并emit给bolt,但是部分消息没有得到bolt的处理