根据文件是否为 .gz 打开文件
open file depending on whether it's .gz or not
我正在尝试找出打开 python 文件的最佳方式是基于其类型。
例如,我有一些像这样的基本内容,但对我来说 'pythonic' 我觉得它可以通过某种方式重构并写得更清晰;
def openfile(filename):
if read_file_from_top:
if not filename.endswith('.gz'):
with open(filename, 'r') as infile:
for line in infile:
# do something
else:
with gzip.open(filename, 'r') as infile:
for line in infile:
# do something
elif read_file_from_bottom:
if not filename.endswith('.gz'):
with open(filename, 'r') as infile:
for line in infile:
# do something
else:
with gzip.open(filename, 'r') as infile:
for line in infile:
# do something
是否有更好的方法来做到这一点,也许使用生成器?谢谢
我觉得这样至少好一点:
import gzip
def file_line_gen(filename):
if filename.endswith('.gz'):
open_fn = gzip.open
else:
open_fn = open
with open_fn(filename, 'r') as f:
for line in f:
yield line
for line in file_line_gen('data.gz'):
# do something here
print repr(line)
你应该把开头和阅读分开:
def openfile(filename, mode='r'):
if filename.endswith('.gz'):
return gzip.open(filename, mode)
else:
return open(filename, mode)
with openfile(filename, 'r') as infile:
for line in infile:
# do something
使用预定义的关键函数列表的简短解决方案:
def processFile(filepath):
with [open, gzip.open][0 if not filepath.endswith('.gz') else 1](filepath, 'r') as fh:
if read_file_from_top:
# do something
elif read_file_from_bottom:
# do something
我正在尝试找出打开 python 文件的最佳方式是基于其类型。
例如,我有一些像这样的基本内容,但对我来说 'pythonic' 我觉得它可以通过某种方式重构并写得更清晰;
def openfile(filename):
if read_file_from_top:
if not filename.endswith('.gz'):
with open(filename, 'r') as infile:
for line in infile:
# do something
else:
with gzip.open(filename, 'r') as infile:
for line in infile:
# do something
elif read_file_from_bottom:
if not filename.endswith('.gz'):
with open(filename, 'r') as infile:
for line in infile:
# do something
else:
with gzip.open(filename, 'r') as infile:
for line in infile:
# do something
是否有更好的方法来做到这一点,也许使用生成器?谢谢
我觉得这样至少好一点:
import gzip
def file_line_gen(filename):
if filename.endswith('.gz'):
open_fn = gzip.open
else:
open_fn = open
with open_fn(filename, 'r') as f:
for line in f:
yield line
for line in file_line_gen('data.gz'):
# do something here
print repr(line)
你应该把开头和阅读分开:
def openfile(filename, mode='r'):
if filename.endswith('.gz'):
return gzip.open(filename, mode)
else:
return open(filename, mode)
with openfile(filename, 'r') as infile:
for line in infile:
# do something
使用预定义的关键函数列表的简短解决方案:
def processFile(filepath):
with [open, gzip.open][0 if not filepath.endswith('.gz') else 1](filepath, 'r') as fh:
if read_file_from_top:
# do something
elif read_file_from_bottom:
# do something