V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Mush
V2EX  ›  问与答

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

  •  
  •   Mush · Nov 2, 2015 · 3031 views
    This topic created in 3832 days ago, the information mentioned may be changed or developed.

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

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

    f = open('xxx')
    f.seek(0, os.SEEK_END)
    print f.tell()
    Mush
        12
    Mush  
    OP
       Nov 2, 2015
    @aisk 恩, 谢谢. 但我的具体情况是, 我并没有解压这个压缩文件, 我是用 tar -tvf 拿到解压后文件大小, 然后用 subprocess.Popen(["zcat", log_file],stdout=subprocess.PIPE)进行读取. 不过我具体测试了一下, 计算出来的文件大小差别不大, 可以满足我做个读取进度的需求, 所以暂时先这么用, 哪天有空了再仔细研究下.
    Freedom1
        13
    Freedom1  
       Nov 3, 2015
    不要用 ls 算文件大小,用 du -h,本人亲测 ls -lh 和 ll -h 算出的文件大小不正确,用 du -h 比较接近
    aisk
        14
    aisk  
       Nov 3, 2015
    @Mush 那可以考虑读到 StringIO 里再计算文件大小。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   836 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 21:58 · PVG 05:58 · LAX 14:58 · JFK 17:58
    ♥ Do have faith in what you're doing.