在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文件后文件大小发生变化的主要内容,如果未能解决你的问题,请参考以下文章

Python中读文件写文件的操作方法

storm问题记录 python 不断向kafka中写消息,spout做为消费者从kafka中读消息并emit给bolt,但是部分消息没有得到bolt的处理

python tkinter 如何使canvas上的图片随着窗体变化而动态变化?

文件channel用法

为啥 fstream 在这里不起作用(在文件中读/写)?

如何在 .Net Core 中读/写文件?