这是一个关于 Python 读文件的问题

2015-11-02 13:52:14 +08:00
 Mush

我有一个文件, ls 显示的大小是 1000k, 然后我 readline 读, 把每行的 sys.getsizeof(line)加起来, 最终结果却跟 ls 显示不一样, 请问我哪里弄错了呀?

2453 次点击
所在节点    问与答
14 条回复
Mush
2015-11-02 14:11:02 +08:00
用 len 也不对......怎么都对不上
MarioLuisGarcia
2015-11-02 14:13:59 +08:00
getsizeofline 得到的是 python 字符串的长度吧。
python 一个空字符""的长度都有 37 ,因为它是一个对象,带了很多方法。
Mush
2015-11-02 14:15:28 +08:00
@MarioLuisGarcia 这个我 get 到了, 搞错了这个函数的意思.....但是用 len 的话也是对不上的....
ChanneW
2015-11-02 14:18:40 +08:00
ls 是实际占用空间吧。
操作系统不会给文件正好分配文件实际大小那么大的空间的。
MarioLuisGarcia
2015-11-02 15:16:29 +08:00
@Mush 如果你用 len 的话,首先得确定 len 返回来的数值单位是什么,然后你确定 ls 返回来的单位是什么?两者计算方式有无不同。然后再做对比。
aisk
2015-11-02 15:18:00 +08:00
用 len 来获取的话,跟你的字符串编码方式有关,推荐不要用字符串来保存你的数据。
Mush
2015-11-02 15:31:26 +08:00
@aisk 是合作方用文本保存的数据, 一个文件好几个 G.....
Mark3K
2015-11-02 16:03:50 +08:00
使用 len 计算字符串长度,如果字符串编码是 ASCII 的话一个中文算 2 个,如果是 UNICODE 的话就算 1 个
aisk
2015-11-02 18:14:57 +08:00
@Mush 跟合作方没有关系,是你读到内存之后的保存方式。另外你直接看这个 file 对象的大小不就好了?
Mush
2015-11-02 18:25:37 +08:00
@aisk 是 100 多个 G 的压缩文件, 每个大概 2 到 3 个 G....
aisk
2015-11-02 21:50:27 +08:00
@Mush

f = open('xxx')
f.seek(0, os.SEEK_END)
print f.tell()
Mush
2015-11-02 22:22:01 +08:00
@aisk 恩, 谢谢. 但我的具体情况是, 我并没有解压这个压缩文件, 我是用 tar -tvf 拿到解压后文件大小, 然后用 subprocess.Popen(["zcat", log_file],stdout=subprocess.PIPE)进行读取. 不过我具体测试了一下, 计算出来的文件大小差别不大, 可以满足我做个读取进度的需求, 所以暂时先这么用, 哪天有空了再仔细研究下.
Freedom1
2015-11-03 09:19:59 +08:00
不要用 ls 算文件大小,用 du -h,本人亲测 ls -lh 和 ll -h 算出的文件大小不正确,用 du -h 比较接近
aisk
2015-11-03 11:04:33 +08:00
@Mush 那可以考虑读到 StringIO 里再计算文件大小。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/232910

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX