2017-02-17 146 views
0

我試圖在Python腳本中執行批處理命令,只是顯示PDF文件的名稱。基本上,Python腳本位於文件夾C:\users\me\desktop\python中,該文件夾應該在桌面上的其他文件夾(C:\users\me\desktop\some-folder)上執行命令,該文件夾中包含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才能運行此類命令。

其次,即使這樣做也行不通,因爲雙重百分比是爲腳本保留的。在線命令需要一個鞋底%

第三:不要使用os.chdir,這是不好的做法。更好地使用cwd選項subprocess調用,允許在運行命令時在本地更改目錄。

這將工作:

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

當然,這可能是因爲你的命令的示例無所作爲:你沒有得到的輸出回到你的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文件,所以它不是很高性能/糟糕的設計&複雜。

爲您的整個轉換循環我稱之爲轉換器的每個文件,無需蝙蝠腳本,你有蟒蛇!:

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都會出現多次? – vdvaxel

+0

我看到你編輯了你的答案:我確實得到了與.pdf文件一樣多的輸出。我應該如何更改我的代碼來防止這種情況發生 – vdvaxel

+0

你想打印文件還是做其他的事? –

相關問題