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 配置要求有多个输出文件怎么办?应该它写给所有文件?还是最后一个?还是第一个?因此,您可以决定如何实际处理任何文件。)