批处理文件转换和使用

时间:2013-01-14 09:01:50

标签: 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-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脚本,它可以完美地运行。但是,当我尝试在批处理文件中将它们链接在一起时,它会中断。我会很感激所有的想法! 提前谢谢!

3 个答案:

答案 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',然后它应该可以工作。