最近需要处理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.reader和csv.DictReader的区别在于:
- 使用reader读进来的是一个list嵌套list的数据结构,
- 使用DictReader读取进来的是一个dict的数据结构,它会使用第一行作为dict的key。
所以如果数据是有headline的话那么就可以用DictReader,如果没有头那么最好用reader
网友评论