gpt4 book ai didi

python - 在Python中读取文件时如何自动处理解压?

转载 作者:行者123 更新时间:2023-12-01 05:38:09 25 4
gpt4 key购买 nike

我正在编写一些 Python 代码,它循环访问多个文件并处理每个文件的前几百行。我想扩展此代码,以便如果列表中的任何文件被压缩,它会在读取它们时自动解压缩,以便我的代码始终接收解压缩的行。基本上我的代码目前看起来像:

for f in files:
handle = open(f)
process_file_contents(handle)

是否有任何函数可以替换上述代码中的 open ,以便如果 f 是纯文本或 gzip 压缩文本(或 bzip2 等),该函数将始终返回文件解压内容的文件句柄? (无需查找,只需顺序访问。)

最佳答案

我遇到了同样的问题:我希望我的代码接受文件名并返回一个文件句柄以与with一起使用,自动压缩等。

就我而言,我愿意信任文件扩展名,我只需要处理 gzip 和 bzip 文件。

import gzip
import bz2

def open_by_suffix(filename):
if filename.endswith('.gz'):
return gzip.open(filename, 'rb')
elif filename.endswith('.bz2'):
return bz2.BZ2file(filename, 'r')
else:
return open(filename, 'r')

如果我们不信任文件名,我们可以比较文件的初始字节是否有魔术字符串(修改自 https://stackoverflow.com/a/13044946/117714 ):

import gzip
import bz2

magic_dict = {
"\x1f\x8b\x08": (gzip.open, 'rb')
"\x42\x5a\x68": (bz2.BZ2File, 'r')
}
max_len = max(len(x) for x in magic_dict)

def open_by_magic(filename):
with open(filename) as f:
file_start = f.read(max_len)
for magic, (fn, flag) in magic_dict.items():
if file_start.startswith(magic):
return fn(filename, flag)
return open(filename, 'r')

用法:

# cat
for filename in filenames:
with open_by_suffix(filename) as f:
for line in f:
print f

您的用例如下所示:

for f in files:
with open_by_suffix(f) as handle:
process_file_contents(handle)

关于python - 在Python中读取文件时如何自动处理解压?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18367511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com