我正在编写一个小批处理脚本的问题。批处理脚本的要点是运行一个Javascript文件,将XML文件转换为csv文件,然后运行Python脚本,该脚本将分析刚刚创建的csv文件并创建另一个csv文件。
批处理脚本如下。
start XML-CSV_Converter.js
python CSV_ANALYZER.py
exit
我没有编写XML-CSV转换器; 在这里能找到它。 (http://gotochriswest.com/blog/2011/05/05/excel-batch-convert-xls-to-csv/)我唯一改变的是我删除了所有警报和输入提示,所以它没有等待任何用户输入。简单地说,它只是查看当前目录中的每个XML文件,并在同一目录中生成一个csv文件。
每当我运行批处理脚本时,我的Python脚本中都会出现IO错误,因为即使它可以看到创建的文件,也无法打开文件。
确切的错误是:
"IOError: [Errno 2] No such file or directory: 'NAME_OF_FILE.csv'"
下面列出了导致错误的Python脚本部分。
dirList = os.listdir("C:\FOLDER")
for fname in dirList:
if fname.find(".csv") != -1:
inputFile = open(fname,'r') <---- Script halts here
有人知道可能导致文件无法在Python脚本中打开的原因吗? 如果我手动运行JavaScript文件,然后手动运行Python脚本,它可以完美地运行。但是,当我尝试在批处理文件中将它们链接在一起时,它会中断。我会很感激所有的想法! 提前谢谢!
答案 0 :(得分:2)
start
命令启动程序(或者,在您的情况下,文件)并立即返回,而不等待程序退出。这意味着当Python尝试打开文件时,JS脚本可能仍在运行,并且该文件专门用于写入。
您应该通过直接调用Windows Scripting Host(cscript.exe)来运行JS文件。只需将start
命令替换为:
cscript //nologo XML-CSV_Converter.js
这将确保在运行Python命令时,JS脚本将完成其作业并安全终止。
答案 1 :(得分:1)
您忘记在open()
来电中将文件夹名称添加到文件名中。 listdir()
仅返回文件名,因此除非其路径参数与当前目录匹配,否则您必须将其添加到返回的文件名中以正确识别它们。
作为旁注,您还应该避免在普通字符串中使用反斜杠。在这种情况下,“C:\ FOLDER”正常工作,但“C:\ folder”不会,因为\f
将转换为\x0c
(换行符)。您应该使用原始字符串(r'C:\FOLDER'
不转换转义字符),转义反斜杠('C:\\FOLDER'
)或更可移植的'C:/FOLDER'
(在Windows '/'
上是替代路径分隔符。)
检查扩展名的一种更简单的方法是测试名称是否以它结尾(s.find(t) == -1
不是非常Pythonic)。总而言之,修改后的代码看起来像这样:
folder = "C:/FOLDER"
for fname in os.listdir(folder):
if fname.endswith(".csv"):
inputFile = open(os.path.join(folder, fname),'r')
答案 2 :(得分:0)
根本原因是在XML-CSV_Converter.js未完成时执行了“python CSV_ANALYZER.py”。
按“start XML-CSV_Converter.js”类型,它不会在执行下一个命令之前等待此命令完成。
如果你已经安装了js解释器,你可以删除第一行中的`start',然后它应该可以工作。