如何解决Python argparse.FileType('w') 只创建空文件
我一直在使用 argparse,但在使用 argparse 的可选输出参数 (--outfile) 将输出写入文件时遇到问题。使用 --outfile 参数时我总是得到一个空文件,但使用标准输出有效。我对 Python 还很陌生,所以我可能遗漏了一些明显的东西。
我实际上正在开发一个更复杂的程序,它有点太长而无法共享,因此我创建了一个简单的虚拟示例,该示例出现相同的错误。
这是代码:
import argparse
import sys
def print_content(file):
for lines in file:
print(f'This is the content: {lines}')
def create_argument_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser('printer',description='a commandline tool that prints the content of a file')
parser.add_argument('input_file',type=argparse.FileType(encoding='utf-8'),default=[sys.stdin],Metavar='FILE')
parser.add_argument('--outfile','-o',type=argparse.FileType('w',encoding='utf-8'),default=[sys.stdout],Metavar='FILE')
parser.add_argument('--print',help='if present,prints the content of the file',action='store_true')
return parser
def main():
parser = create_argument_parser()
args = parser.parse_args()
if args.print:
print_content(args.input_file)
if __name__ == '__main__':
main()
如果我使用下面的标准输出,它可以工作:
$ python program.py text.txt --print < output.txt
但是,如果我使用 --outfile 参数,文件将被创建但仍为空。
$ python program.py text.txt --print --outfile output.txt
我错过了什么? (我使用 Python 3.8.5。)
解决方法
argparse
为您创建文件,但您仍然可以对新文件执行任何操作。
例如,您可以尝试
def write_contents(in_file,out_file):
for line in in_file:
out_file.write(line)
def main():
parser = create_argument_parser()
args = parser.parse_args()
if args.print:
write_content(args.input_file,args.output_file)
您似乎假设 print
会打印到文件,但它总是简单地打印到标准输出; argparse
没有做任何事情来实际向文件添加任何内容(如果这样做了会令人惊讶;如果您有一个 argparse
配置要求有多个输出文件怎么办?应该它写入所有文件?还是最后一个?还是第一个?因此,您可以决定对任何文件进行实际操作。)
您可以使用它来将列表中的行写入文件
def file_write_csv(csv_name,csv_content):
""" generic csv writer """
print("writing " + csv_name)
with open(csv_name,"w") as out:
for csv_line in csv_content:
if not "\n" in csv_line:
csv_line = csv_line + "\n"
out.write(csv_line)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。