Python argparse.FileType('w') 只创建空文件
Python argparse.FileType('w') creates only empty files
我一直在使用 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。)
您可以使用它来为列表的行写入文件
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)
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
配置要求有多个输出文件怎么办?应该它写给所有文件?还是最后一个?还是第一个?因此,您可以决定如何实际处理任何文件。)
我一直在使用 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。)
您可以使用它来为列表的行写入文件
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)
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
配置要求有多个输出文件怎么办?应该它写给所有文件?还是最后一个?还是第一个?因此,您可以决定如何实际处理任何文件。)