美文网首页
zipfile 和gzip的区别,巧用gzip读取文本文件

zipfile 和gzip的区别,巧用gzip读取文本文件

作者: 贾磊_cd | 来源:发表于2018-06-13 16:00 被阅读13次

    最近需要处理linux下的gz问题,发现有两个各相似的包好像都可以处理gz,但是使用上又有一些区别

    zipfile

    • 可以处理zip压缩包,将多个文件压缩到一个压缩包中,或者从压缩包中读取其中的各个文件
    • 使用的时候需要先创建zipfile对象,然后使用zip对象的open方法打开文件并进行读写
    • 使用open方法的时候需要传入file_path, 这个path可以使用file_obj.namelist()来获取
    for filename in file_obj.namelist():
         with zip_files.open(filename ) as parse_file_handler:
             for line in parse_file_handler.readlines():
                  print (line)
    

    gzip

    可以处理单个文件,可以直接open压缩文件并从中读取或者写入数据

    对于linux下的gz文件,我发现zipfile并没有将它识别为zip文件,这个时候就只能使用gzip了,并且gzip可以直接open方便快捷

    gzip读取文本文件

    使用gzip的时候默认方式会将file打开为byte格式,就是说读出来的字符串都是bytes格式化的,打印的时候还需要重新转换格式。可以通过下面的方法来直接让gzip读出string格式的数据, 注意这里使用了 ‘rt’encoding 参数

    with gzip.open(file_path, 'rt', encoding='utf-8') as input:
         for line in input.readlines():
             print(line)
    

    更进一步,可以使用csv来处理gzip读入的文件

    with gzip.open(file_path, 'rt', encoding='utf-8') as zf:
        tsvin = csv.reader(zf, delimiter='\t')
        for line in tsvin:
            yield line
    

    或者

    with gzip.open(file_path, 'rt', encoding='utf-8') as zf:
        tsvin = csv.DictReader(zf, delimiter='\t')
        for line in tsvin:
            yield line
    

    这里csv.readercsv.DictReader的区别在于:

    • 使用reader读进来的是一个list嵌套list的数据结构,
    • 使用DictReader读取进来的是一个dict的数据结构,它会使用第一行作为dict的key。

    所以如果数据是有headline的话那么就可以用DictReader,如果没有头那么最好用reader

    相关文章

      网友评论

          本文标题:zipfile 和gzip的区别,巧用gzip读取文本文件

          本文链接:https://www.haomeiwen.com/subject/gvgjeftx.html