为什么os.path.getsize给我错误的大小?

1 投票
1 回答
1410 浏览
提问于 2025-04-30 02:46

我有一个小的 HTML 文件,叫做 home.html,我在使用它的时候发现 os.path.getsize('home.html') 得到的大小和 len(open('home.html').read()) 得到的大小不一样。前者给出的大小是 925 字节,而后者给出的大小是 910 字节。我知道 910 是正确的,因为用 925 字节在 Chrome 浏览器里无法正常显示,但用 910 字节就能完美显示。有人能告诉我这是怎么回事吗?

顺便说一下,我觉得这不是 Unicode 的问题,因为我在 Windows 上,使用的是 Python 2.7,file.read 的结果是一个 str 类型,而不是 unicode 对象,而且我 HTML 文件里的所有字符都是 ASCII 字符。这里是 home.html 的内容:

<!DOCTYPE html>
<html>
<body style="text-align:center;">
<a href="https://github.com/ChrisCalderon/Yashttpd">
<img style="position:absolute;top:0;right:0;border:0;" src="https://camo.githubusercontent.com/a6677b08c955af8400f44c6298f40e7d19cc5b2d/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677261795f3664366436642e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png">
</a>
<h1>ECHO SERVER</h1>
<p>This is how requests are parsed:</p>
<iframe src="echo" style="border:none;width:40%;height:325px;" scrolling="off">
    If you see the text, your browser doesn't support iframes!
</iframe>
<p>The whole code for this site is <a href="myhandler.html">here</a>!</p>
<p>This is all built with Yashttpd. Find it in my GitHub repository by clicking the ribbon above!</p>
</body>
</html>

补充一下:我想提到的是,os.path.getsize 在处理我的 favicon.ico 文件时似乎是正常工作的。

暂无标签

1 个回答

3

这个文件有15行,而你发现它在磁盘上的大小和在内存中的大小相差15字节。在Windows系统中,每行的结束符是一个叫做"\r\n"的字符组合,但当你读取这个文件时(除非你用二进制模式打开它),Python(或者说底层的程序)会把这个组合转换成Python使用的行结束符,也就是"\n"

这两个值都是正确的:

  • 在磁盘上,这个文件的大小是925字节,行的结束符是\r\n
  • 在内存中,这个文件的大小是910字节,行的结束符只有\n

撰写回答