1

我正在编写的小批量脚本有问题。批处理脚本的重点是运行一个将 XML 文件转换为 csv 文件的 Javascript 文件,然后运行一个 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 脚本,它会完美运行。但是当我尝试在批处理文件中将它们链接在一起时,它会中断。我将不胜感激任何和所有的想法!提前致谢!

4

3 回答 3

2

start命令启动一个程序(或者,在您的情况下,一个文件)并立即返回,而无需等待程序退出。这意味着当 Python 尝试打开该文件时,JS 脚本可能仍在运行,并且该文件专门为写入而打开。

您应该通过直接调用 Windows 脚本主机 (cscript.exe) 来运行 JS 文件。只需将start命令替换为:

cscript //nologo XML-CSV_Converter.js

这将确保在运行 Python 命令时,JS 脚本将完成其工作并安全终止。

于 2013-01-14T09:18:02.363 回答
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')
于 2013-01-14T10:02:02.273 回答
0

根本原因是在 XML-CSV_Converter.js 未完成时执行了“python CSV_ANALYZER.py”。

通过键入“start XML-CSV_Converter.js”,在执行下一个命令之前,它不会等待该命令完成。

如果你安装了js解释器,你可以去掉第一行的`start',那么它应该可以工作了。

于 2013-01-14T09:18:46.577 回答