Python argparse.FileType('w') 只创建空文件

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?