我正在尝试解析一个压缩的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个字段中的所有值求和更快的方法?
谢谢!
答案 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)