Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 批处理文件转换和使用_Javascript_Python_Windows_Batch File - Fatal编程技术网

Javascript 批处理文件转换和使用

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

我正在编写的小批量脚本有问题。批处理脚本的要点是运行一个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]没有这样的文件或目录:'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
参数,即可启动应用程序并等待其结束。