Python从gzip压缩文件中读取csv行

时间:2018-08-01 03:01:44

标签: python csv gzip

我正在尝试解析一个压缩的csv文件(其中的字段由|字符分隔),以测试在内容解析中直接在Python中读取文件是否比zcat file.gz | python快。

我有以下代码:

#!/usr/bin/python3

import gzip

if __name__ == "__main__": 
    total=0
    count=0

    f=gzip.open('SmallData.DAT.gz', 'r')
    for line in f.readlines():
        split_line = line.split('|')
        total += int(split_line[52])
        count += 1

    print(count, " :: ", total)

但是出现以下错误:

$ ./PyZip.py 
Traceback (most recent call last):
  File "./PyZip.py", line 11, in <module>
    split_line = line.split('|')
TypeError: a bytes-like object is required, not 'str'

如何修改此内容以读取并正确分割行?

我主要只对第52个字段感兴趣,用|分隔。输入文件中的行如下所示:

field1 | field2 | field3 | ... field52 | field53

是否有比对第52个字段中的所有值求和更快的方法?

谢谢!

2 个答案:

答案 0 :(得分:1)

由于解压缩的文件被读取为字节,因此应在分割之前先对行进行解码:

split_line = line.decode('utf-8').split('|')

用于汇总第52个字段中所有值的代码很好。没有办法提高速度,因为仅需读取并拆分所有行即可识别每行的第52个字段。

答案 1 :(得分:1)

只需尝试将bytes对象解码为字符串。即

line.decode('utf-8')

更新的脚本:

#!/usr/bin/python3
import gzip

if __name__ == "__main__": 
    total=0
    count=0

    f=gzip.open('SmallData.DAT.gz', 'r')
    for line in f.readlines():
        split_line = line.decode("utf-8").split('|')
         total += int(split_line[52])
         count += 1

    print(count, " :: ", total)