2017-02-17 18 views
0

Pythonスクリプトでバッチコマンドを実行しようとしていますが、単にPDFファイル名を表示しています。基本的に、Pythonスクリプトは、デスクトップ上の別のフォルダ(C:\users\me\desktop\some-folder)にコマンドを実行するフォルダC:\users\me\desktop\pythonにあります。サブフォルダにはPDFが含まれています。Pythonスクリプトでバッチコマンドを実行する

from subprocess import call 
import os 

for root, dirs, files in os.walk("../some-folder"): 
    for pdf_file in files: 
     if pdf_file.endswith(".pdf"): 
      pdf_file_path = os.path.join(root, pdf_file) 
      os.chdir(root) 
      call('for %%f in (*.pdf) do @echo %%f') 

私が得る結果は、「ファイルが見つかりません」です。ここで

はコードです。

+0

すでにpythonでpdf名を取得している場合、なぜcmd.exeのFORコマンドを使用して再度それらを反復しようとしていますか?私はこれがバッチファイルの問題であるとは思わない。この質問にはバッチファイルのコードはありません。 – Squashman

答えて

3

最初に、組み込みのDOSコマンドを有効にしているので、このようなコマンドを実行するには、shell=Trueを設定する必要があります。

第2に、それでも2パーセントはスクリプト用に予約されているため、機能しません。インラインコマンドでは、唯一の唯一の%が必要です。

第3位:os.chdirを使用しないでください。悪い習慣です。より良いcwdオプションのsubprocessコールを使用して、コマンドを実行するときにディレクトリをローカルに変更することができます。

働くだろう

:もちろん

call('for %f in (*.pdf) do @echo %f',shell=True,cwd=root) 

あなたのコマンドは何も達成していないので、これはおそらく例である:あなたが戻ってあなたのPythonスクリプトでの出力を得ることはありません、あなたはリターンコードをチェックしません。.. 。

あなたは(フルパスで)ルートディレクトリのpythonで*.pdfのリストを取得したい場合は、私はあなたが

list_of_pdfs = glob.glob(os.path.join(root,"*.pdf")) 

または相対的に知っていることを推測:

list_of_pdfs = [x for x os.listdir(root) if fnmatch.fnmatch(x,"*.pdf")] 

いますが、os.walkループにしているので、そこに.PDFファイルですので、それは非常にパフォーマンス/悪いデザイン&複雑ではないとして、あなたは出力に何度でもを取得します。あなたの全体の変換ループの

私は、ファイルごとに.BATスクリプトの必要性をコンバータを呼び出すないだろう、あなたのpythonを持っている!:

from subprocess import call 
import os 

for root, dirs, files in os.walk("../some-folder"): 
    for pdf_file in files: 
     if pdf_file.endswith(".pdf"): 
      call([r"C:\xpdf\bin32\pdftotext","-raw",pdf_file], cwd=root) 

リストで引数を渡すと、自動的にファイル名にスペースを処理します。

+0

ありがとう、これは働いた!しかし、例のようにPDFファイル名を印刷するだけで、すべてのPDFはリストに1回だけ含まれていても複数回表示されます。 – vdvaxel

+0

私はあなたの答えを編集したことを知っています。実際には、.pdfファイルの数だけ出力が得られます。これを防ぐためにコードをどのように変更する必要がありますか? – vdvaxel

+0

ファイルを印刷するだけですか他に何かしたいですか? –

関連する問題