我有同樣的問題:我想我的代碼接受文件名,並返回一個文件句柄與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,
"\x42\x5a\x68": bz2.BZ2File,
}
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 in magic_dict.items():
if file_start.startswith(magic):
return fn(filename)
用法:
# 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)
這不是重複的。我知道如何使用'gzip.open'。我基本上是問是否有一個函數查看文件並自動選擇'open','gzip.open'或其他任何打開的函數適用於正在使用的壓縮,所以我不必編寫一堆try/catch語句來嘗試每個可能的開放函數。 –
類似[this](http://stackoverflow.com/questions/13044562/python-mechanism-to-identify-compressed-file-type-and-uncompress)? – Oli