Javascript 批处理文件转换和使用
我正在编写的小批量脚本有问题。批处理脚本的要点是运行一个Javascript文件,将XML文件转换为csv文件,然后运行一个Python脚本,该脚本将分析刚刚创建的csv文件并创建另一个csv文件 下面是批处理脚本Javascript 批处理文件转换和使用,javascript,python,windows,batch-file,Javascript,Python,Windows,Batch File,我正在编写的小批量脚本有问题。批处理脚本的要点是运行一个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-b
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]没有这样的文件或目录:'NAME\u 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
dirList=os.listdir(“C:\FOLDER”)
对于目录列表中的fname:
如果fname.find(“.csv”)!=-1:
inputFile=open(fname,'r')该start
命令启动一个程序(或者,在您的情况下,启动一个文件)并立即返回,无需等待程序退出。这意味着,当Python试图打开该文件时,JS脚本可能仍在运行,并以独占方式打开该文件以供编写
您应该通过直接调用Windows脚本主机(cscript.exe)来运行JS文件。只需将start
命令替换为:
cscript //nologo XML-CSV_Converter.js
这将确保在运行Python命令时,JS脚本将完成其作业并安全终止。根本原因是在XML-CSV_Converter.JS未完成时执行了“Python CSV_ANALYZER.py”
通过键入“start XML-CSV_Converter.js”,它不会等到这个命令完成后再执行下一个命令
如果您安装了js解释器,您可以删除第一行中的“start”,然后它应该可以工作。您忘记在open()
调用中将文件夹名称添加到文件名中listdir()
只返回文件名,因此除非其path参数与当前目录匹配,否则必须将其添加到返回的文件名中以正确识别它们
另外,您还应该避免在普通字符串中使用反斜杠。在这种情况下,“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')
你验证过JS脚本是否正在运行吗?是的。它创建了新的csv文件,在批处理脚本中断后,我可以在Windows资源管理器中看到它。默认情况下,JS文件与wscript.exe关联,这意味着不会将任何输出发送到控制台。这就是我建议显式使用cscript.exe的原因。感谢您的回复!不幸的是,它似乎无法解决问题。它仍然会导致Python脚本中出现相同的IOError。好的,我添加了另一个答案,但我也留下了这个答案,因为这是一个可能会影响其他人的常见问题。如果.js
文件与wscript
关联,您可以使用start
命令执行它们,只需在文件名前添加/wait
参数,即可启动应用程序并等待其结束。