argparse将结果写入文件

时间:2018-02-14 07:00:17

标签: python command-line argparse

我正在尝试学习如何使用argparse()将.py代码转换为命令行。下面是我的测试学习脚本。我无法弄清楚如何将输出写入文件。我尝试了两种情况:

  1. 我使用parser.add_argument('out_file', type= argparse.FileType('w')),这会产生以下错误:“强制转换为Unicode:需要字符串或缓冲区,找到文件”。我的理解是已经打开了一个文件来写作。
  2. 或者我使用in_file = open(in_file, "r"),并获取 AttributeError:'str'对象没有属性'write',这意味着它会看到我对 out_file 变量的输入作为字符串,而不是作为应该写入结果的文件。
  3. 我将非常感谢您解决问题的任何帮助。

    import csv
    import argparse
    import numpy as np  
    
    def TESTFun(x_center, y_center, in_file, out_file):
        #in_file = open(in_file, "r")
        out_file = open(out_file, "w")
        f= np.genfromtxt(("\t".join(i) for i in csv.reader(in_file)),
                        delimiter = "\t", 
                        dtype = int)
        summ = x_center + y_center + f
        return out_file.write(str(summ) + "\n")
        out_file.close()
    
    def ToCommandLine():
        parser = argparse.ArgumentParser(description="This is a command to test")
        parser.add_argument('in_file',  type= argparse.FileType('r'))   #nargs='?'
        parser.add_argument('out_file', type= argparse.FileType('w'))
        parser.add_argument('-x_center', type= float, required= True)
        parser.add_argument('-y_center',  type= float, required= True)
        args = parser.parse_args()
    
        TESTFun(args.x_center, args.y_center, args.in_file, args.out_file)
    
    if __name__ == '__main__':
        ToCommandLine()
    
    
    TESTFun(1, 4, "test.txt", "outtest.txt")
    

2 个答案:

答案 0 :(得分:2)

下次发布完整堆栈,特别是发生错误的位置 - 这将立即显示错误的位置,也可能是错误。我在这里猜测:

#in_file = open(in_file, "r")

和out文件相同:

out_file = open(out_file, "r")

type= argparse.FileType的工作方式是为您打开文件。您正在尝试打开一个打开的文件 - 删除这两行,并直接使用args.in_fileargs.out_file作为文件描述符。

使用FileType而不是您自己打开的字符串的优点是argparse将检查打开时的错误,如果打开文件时出现问题,请以精确打印的方式通知您。

答案 1 :(得分:0)

您已将in_fileout_file的类型设置为“文件对象”。将其设置为str并将路径传递给文件,并在命令行中将文件名作为相关参数。

import csv
import argparse
import numpy as np  

def TESTFun(x_center, y_center, in_file, out_file):
    in_file = open(in_file, "r")
    out_file = open(out_file, "w")
    f= np.genfromtxt(("\t".join(i) for i in csv.reader(in_file)),
                    delimiter = "\t", 
                    dtype = int)
    summ = x_center + y_center + f
    return out_file.write(str(summ) + "\n")
    out_file.close()

def ToCommandLine():
    parser = argparse.ArgumentParser(description="This is a command that enables to visualize GOs")
    parser.add_argument('in_file', type=str, required= True)   # Enter the file path here
    parser.add_argument('out_file', type=str, required= True)  # Enter the file path here
    parser.add_argument('-x_center', type= float, required= True)
    parser.add_argument('-y_center',  type= float, required= True)
    args = parser.parse_args()

    TESTFun(args.x_center, args.y_center, args.in_file, args.out_file)

if __name__ == '__main__':
    ToCommandLine()


TESTFun(1, 4, "test.txt", "outtest.txt")