因此,我創建了一個 Python 腳本來使用 Ghostscript 批量轉換 PDF 檔案。理想情況下它應該可以作業,但我不確定為什么它不起作用。目前,它會通過兩次輸入 PDF 檔案,當它第二次運行時,它會覆寫輸出檔案。
這是腳本。
from __future__ import print_function
import os
import subprocess
try:
os.mkdir('compressed')
except FileExistsError:
pass
for root, dirs, files in os.walk("."):
for file in files:
if file.endswith(".pdf"):
filename = os.path.join(root, file)
arg1= '-sOutputFile=' './compressed/' file
print ("compressing:", file )
p = subprocess.Popen(['gs', '-sDEVICE=pdfwrite', '-dCompatibilityLevel=1.4', '-dPDFSETTINGS=/screen', '-dNOPAUSE', '-dBATCH', '-dQUIET', str(arg1), filename], stdout=subprocess.PIPE).wait()
這是輸出。

我想念我做錯了什么。
uj5u.com熱心網友回復:
file只是檔案名。您在不同的目錄中有多個相同的檔案。不要忘記os.walk默認情況下在子目錄中遞回。
因此,您必須將轉換后的檔案保存在依賴于root.
并將輸出目錄放在當前目錄之外,os.walk將掃描它
例如,對于平面輸出替換:
arg1= '-sOutputFile=' './compressed/' file
經過
arg1= '-sOutputFile=' '/somewhere/else/compressed/' root.strip(".").replace(os.sep,"_") "_" file
表達方式
root.strip(".").replace(os.sep,"_")
應該創建一個root沒有當前目錄(無點)和路徑分隔符轉換為下劃線的“平面”版本的樹,加上一個最終的下劃線。這是一種可行的選擇。
將使用不會掃描./compressed或任何其他子目錄(可能更多是您正在尋找的)的os.listdir替代版本(無遞回)
root = "."
for file in os.listdir(root):
if file.endswith(".pdf"):
filename = os.path.join(root, file)
arg1= '-sOutputFile=' './compressed/' file
print ("compressing:", file )
或者 os.scandir
root = "."
for entry in os.scandir(root):
file = entry.name
if file.endswith(".pdf"):
filename = os.path.join(root, file)
arg1= '-sOutputFile=' './compressed/' file
print ("compressing:", file )
uj5u.com熱心網友回復:
您的問題是 os.walk 還將檢索“壓縮”目錄中的內容。這是因為檔案將在 os.walk 列出該目錄中的檔案之前被壓縮和創建。如果您添加print(os.path.join(root, file))到 for 回圈中,您會注意到這一點。
Bellow 是一個有效的片段,因為檢索到的檔案只是當前目錄中的檔案。
import os
os.makedirs("compressed", exist_ok=True)
for file in os.listdir("."):
if not os.path.isfile(file):
continue
if not file.endswith(".pdf"):
continue
print(file)
uj5u.com熱心網友回復:
os.walk根據定義將進入子目錄,因此您將compressed再次壓縮子目錄中的檔案。
可能你只是想要
for file in os.scandir("."):
...
順便說一句,您幾乎肯定希望避免Popen支持subprocess.run()或其遺留變體之一。
uj5u.com熱心網友回復:
在第一次迭代中
for root, dirs, files in os.walk(".")
找到當前目錄中的檔案,然后將它們壓縮到
./compressed/*.pdf路徑中。
之后外回圈的第二次迭代將在子目錄中找到已經壓縮的檔案。
最簡單的解決方法是將輸出目錄移到輸入目錄之外(或在input目錄旁邊創建一個目錄compressed,然后從那里讀取檔案而不是.)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399338.html
