我正在尝试学习如何使用argparse()将.py代码转换为命令行。下面是我的测试学习脚本。我无法弄清楚如何将输出写入文件。我尝试了两种情况:
parser.add_argument('out_file', type= argparse.FileType('w'))
,这会产生以下错误:“强制转换为Unicode:需要字符串或缓冲区,找到文件”。我的理解是已经打开了一个文件来写作。in_file = open(in_file, "r")
,并获取 AttributeError:'str'对象没有属性'write',这意味着它会看到我对 out_file 变量的输入作为字符串,而不是作为应该写入结果的文件。 我将非常感谢您解决问题的任何帮助。
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")
答案 0 :(得分:2)
下次发布完整堆栈,特别是发生错误的位置 - 这将立即显示错误的位置,也可能是错误。我在这里猜测:
#in_file = open(in_file, "r")
和out文件相同:
out_file = open(out_file, "r")
type= argparse.FileType
的工作方式是为您打开文件。您正在尝试打开一个打开的文件 - 删除这两行,并直接使用args.in_file
和args.out_file
作为文件描述符。
使用FileType
而不是您自己打开的字符串的优点是argparse
将检查打开时的错误,如果打开文件时出现问题,请以精确打印的方式通知您。
答案 1 :(得分:0)
您已将in_file
和out_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")