批量文件转换和使用

我正在写一个小批处理脚本。 批处理脚本的要点是运行一个将XML文件转换为csv文件的Javascript文件,然后运行一个Python脚本来分析刚刚创build的csv文件并创build另一个csv文件。

批处理脚本如下。

start XML-CSV_Converter.js python CSV_ANALYZER.py exit 

我没有写XML-CSV转换器; 在这里能find它。 (http://gotochriswest.com/blog/2011/05/05/excel-batch-convert-xls-to-csv/)我改变的唯一的事情是我删除了所有的警报和input提示,所以它不等待任何用户input。 简而言之,它只查看当前目录中的每个XML文件,并在同一目录中生成一个csv文件。

每当我运行批处理脚本时,我都会在Python脚本中得到一个IO错误,因为即使它可以看到创build的文件,也无法打开文件。 确切的错误是: "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脚本,则可以完美运行。 但是当我尝试在batch file中将它们链接在一起时,就会中断。 我会感谢任何和所有的想法! 提前致谢!

您忘记将文件夹名称添加到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') 

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

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

 cscript //nologo XML-CSV_Converter.js 

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

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

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

如果你已经安装了js解释器,你可以在第一行删除`start',然后它就可以工作了。