V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Mush
V2EX  ›  问与答

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

  •  
  •   Mush · 2015-11-02 13:52:14 +08:00 · 2419 次点击
    这是一个创建于 3296 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    f = open('xxx')
    f.seek(0, os.SEEK_END)
    print f.tell()
    Mush
        12
    Mush  
    OP
       2015-11-02 22:22:01 +08:00
    @aisk 恩, 谢谢. 但我的具体情况是, 我并没有解压这个压缩文件, 我是用 tar -tvf 拿到解压后文件大小, 然后用 subprocess.Popen(["zcat", log_file],stdout=subprocess.PIPE)进行读取. 不过我具体测试了一下, 计算出来的文件大小差别不大, 可以满足我做个读取进度的需求, 所以暂时先这么用, 哪天有空了再仔细研究下.
    Freedom1
        13
    Freedom1  
       2015-11-03 09:19:59 +08:00
    不要用 ls 算文件大小,用 du -h,本人亲测 ls -lh 和 ll -h 算出的文件大小不正确,用 du -h 比较接近
    aisk
        14
    aisk  
       2015-11-03 11:04:33 +08:00
    @Mush 那可以考虑读到 StringIO 里再计算文件大小。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2677 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 06:09 · PVG 14:09 · LAX 22:09 · JFK 01:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.