1

私が書いている小さなバッチ スクリプトに問題があります。バッチ スクリプトのポイントは、XML ファイルを csv ファイルに変換する Javascript ファイルを実行してから、作成した csv ファイルを分析して別の csv ファイルを作成する Python スクリプトを実行することです。

バッチスクリプトは以下です。

    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

The start command launches a program (or, in your case, a file) and immediately returns, without waiting for the program to exit. This means that when Python tries to open the file, the JS script is probably still running and has the file open exclusively for writing.

You should run the JS file by directly calling the Windows Scripting Host (cscript.exe). Just replace the start command with:

cscript //nologo XML-CSV_Converter.js

This will ensure that when the Python command is run, the JS script will have completed its job and safely terminated.

于 2013-01-14T09:18:02.363 に答える
1

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')
于 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 に答える