我想创建一个非常简单的脚本,在终端中接收两个不同的路径(输入目录和输出单个文件)。所以我尝试了这个:
if __name__ == "__main__":
p = argparse.ArgumentParser(NAME)
p.add_argument("DIR", default=None,
action="store", help="Inpunt corpus files")
p.add_argument("-o", "--output",
help="Directs the output to a name of your choice")
opts = p.parse_args()
test = tuple(get_all(opts.DIR))
with open('opts.output','w') as out:
csv_out=opts.output.csv.writer(out, delimiter='|')
............
...more lines of code...
................
特别是,我遇到了这条线的麻烦:
with open('opts.output','w') as out:
我不知道如何指定`.csv格式的输出单个文件,当我在终端上测试上面的脚本时没有任何反应:
user@MacBook-User-2:~/Projects $ python script_v1.py /Users/user/Downloads/directory -o /Users/user/Desktop/
有关如何解决这个问题的任何想法吗?先谢谢你们。
答案 0 :(得分:1)
我认为您需要with open(opts.output, 'w')
而不是with open('opts.output', 'w')
注意,argparse实际上有一个特殊的文件类型:
parser.add_argument('-o', '--output', type=argparse.FileType('w'),
default=sys.stdout)
在这种情况下,该文件已经为您打开,并设置了stdout
的合理默认值:
opts.output.write('xyz')
答案 1 :(得分:1)
这不是argparse
问题;它是关于正确调用csv.writer
的。
请查看此csv
示例(来自csv文档页面):
import csv
with open('eggs.csv', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
如果你更换'egg.csv'那应该有用。使用opts.output
中的字符串。请注意文件的打开方式 - 使用' wb'。
我认为FileType
在这里没有帮助。当然它会打开文件,如果不能,则会发出一条很好的argparse
消息。但它是否正确打开文件?并且该打开的文件无法在with
上下文中使用。
当您调用此脚本时,请指定csv文件名,而不仅仅是目录。
-o /Users/user/Desktop/aname.csv
获取类似csv
示例的内容,并在脚本中硬编码测试文件名。一旦有效,您可以担心从命令行获取名称。