我有如下问题代码:
def optimizer(dst, directory = r"G:AttachmentsAttachments" ):
dst = " /d " + dst
reducer = '"' + r"C:Program Files (x86)ORPALISPDF Reducer 3 Professional Editionpdfreducer.exe" + '"' + " /q 2"
for path, dirs, files in os.walk(directory):
src = r" /f " + path
cmd = reducer + src + dst
subprocess.call(cmd)
optimizer(r"C:UsersDesktopReducedPdfs")
我要做的是浏览给定目录中的所有目录,并使用以下命令优化pdfs:CCD_ 1。
问题出在我在上面的方法中一起解析这个命令时使用的路径变量上。如果我将其保留为从os.walk返回的字符串,则它是一个普通字符串,然后斜杠被视为转义序列。如果我把它包装在repr((中,那么它就会被放入PDF Reducer软件中,带有前导和尾随的单引号('(和双反斜杠,程序不知道该怎么办。
我试着用re.sub((和.replacement((将反斜杠替换为正斜杠,但没有成功。re((似乎不能很好地处理转义字符,当我使用.replaces((时,我的程序就没有运行。使用repr((,它会运行,但表示目标中不存在该文件。
subprocess
命令最好作为参数列表,而不仅仅是一个长字符串,这有助于避免某些问题(如转义序列、带空格的路径、引号等(
你应该使用这样的东西(并根据你的需要进行修改(:
cmd = [reducer, '/q', '2', '/f', path, '/d', dst]
subprocess.call(cmd)
请注意,如果您就是这样使用它的,那么像path
、dst
和reducer
这样的路径不需要用引号括起来,即使它们中有空格,因为您已经指定它们是此列表中的单个项。
这就是它在代码中的样子:
def optimizer(dst, directory = r"G:AttachmentsAttachments" ):
reducer = r"C:Program Files (x86)ORPALISPDF Reducer 3 Professional Editionpdfreducer.exe"
for path, dirs, files in os.walk(directory):
cmd = [reducer, '/q', '2', '/f', path, '/d', dst]
subprocess.call(cmd)
optimizer(r"C:UsersDesktopReducedPdfs")
如果你只需要过滤掉那些包含pdf文件的子文件夹,可以这样做:
for path, dirs, files in os.walk(directory):
if any(f.endswith('.pdf') for f in files):
cmd = [reducer, '/q', '2', '/f', path, '/d', dst]
subprocess.call(cmd)
或者,不使用os.walk
(使用pathlib
(的上述更快版本:
from pathlib import Path
paths = {str(f.parent) for f in Path(directory).rglob('*.pdf')}
for path in paths:
cmd = [reducer, '/q', '2', '/f', path, '/d', dst]
subprocess.call(cmd)