如何从Python脚本中调用in2csv?

时间:2015-04-30 01:40:07

标签: python csv argparse

当我尝试调用以下代码时,我遇到以下错误:"您必须在通过STDIN(管道)提供数据时指定格式。"

subprocess.call(["in2csv", "--format", "xls", a_file, ">", output_file], shell=True)

我不确定为什么会这样,因为我告诉它原始格式是什么。我查看了docs,它并不清楚--format和-f之间的区别。

更新:我已将其更改为使用argparse来简化this recommendation之后的参数传递。我也使用了here使用Popen,这显然比根据the docs使用shell = true标志更安全。

parser = argparse.ArgumentParser()
parser.add_argument('in2csv')
parser.add_argument('--format')
parser.add_argument('xls')
parser.add_argument(a_file)
parser.add_argument(">")
parser.add_argument(output_file)
args = parser.parse_args()
print args
subprocess.Popen(args)

1 个答案:

答案 0 :(得分:3)

像你所看到的错误是shell被传入的字符串弄糊涂的症状,例如由于文件名中的空格。在Python中生成进程时,最好避免使用shell。

而不是添加">"和output_file作为参数,尝试使用stdout关键字参数重定向输出,该参数接受将写入输出的文件。

假设:

  • a_file是一个包含输入文件名称的字符串,
  • output_file是一个包含所需输出文件名称的字符串

工作电话可能如下:

with open(output_file, 'wb') as of:
  subprocess.check_call(["in2csv", "--format", "xls", a_file],
                         stdout=of)

这里没有必要使用argparse;它意味着处理进入你的程序的命令行,而不是从它出去。

相关问题