python - 有没有更好的方法来透明地从常规/gzip 文件或 stdin/stdout 读取和写入?
问题描述
我想编写一些从文件(常规/gzip)或标准输入读取并写入文件(常规/gzip)或标准输出的代码。对你来说,这个问题的最佳解决方案是什么?
到目前为止,我的解决方案如下所示:
# read input
if not args.input:
outlines = process_lines(sys.stdin, args)
elif args.input.endswith(".gz"):
with gzip.open(args.input, "r") as infile:
outlines = process_lines(infile, args)
else:
with open(args.input, "r") as infile:
outlines = process_lines(infile, args)
# write output
if not args.output:
for line in outlines:
sys.stdout.write("%s\n" % line)
elif args.output.endswith(".gz"):
with gzip.open(args.output, "w") as outfile:
for line in outlines:
outfile.write("%s\n" % line)
else:
with open(args.output, "w") as outfile:
for line in outlines:
outfile.write("%s\n" % line)
你怎么看?什么是更好更通用的解决方案?
解决方案
infile = sys.stdin
# read input
if args.input:
if args.input.endswith(".gz"):
infile = gzip.open(args.input, "r")
else:
infile open(args.input, "r")
outlines = process_lines(infile, args)
if infile != sys.stdin:
infile.close()
outfile = sys.stdout
# write output
if args.output:
if args.output.endswith(".gz"):
outfile = gzip.open(args.output, "w")
else:
outfile =
open(args.output, "w")
for line in outlines:
outfile.write("%s\n" % line)
if outfile != sys.stdout:
outfile.close()
或者
def open_file(file_path: str, mode: str):
if file_path.endswith(".gz"):
return gzip.open(file_path, mode)
else:
return open(file_path, mode)
def save_result(fp, outlines):
for line in outlines:
outfile.write("%s\n" % line)
if not args.input:
outlines = process_lines(sys.stdin, args)
else:
with open_file(args.input, "r") as infile:
outlines = process_lines(args.input, args)
if not args.output:
save_result(sys.stdout, outlines)
else:
with open_file(args.output, "w") as outfile:
save_result(outfile, outlines)
推荐阅读
- android - 如何构建 ViewPager 来滑动大图像?
- javascript - JS 中的 Gcloud pubsub worker
- javascript - {z}/{x}/{y} 在“tiles”中是什么意思:[location.origin+location.pathname+"countries/{z}/{x}/{y}.pbf"],
- ios - 为什么我不能使用 `isCalculating` 属性来等待计算请求完成
- amazon-redshift - 对表的所有列应用 MAX(LENGTH)
- javascript - Chrome 没有从服务器获取我的新代码。我该如何解决?
- c# - 从powershell调用api时,空值来自Post方法(FromBody)
- javascript - 将客户添加到条带订阅时出错
- angular - ng 工具包和 Angular - 上传到服务器的内容
- r - 如何从年周转换为年月日?