我正在尝试在Python脚本中执行批处理命令,只显示PDF文件名。基本上,Python脚本位于文件夹C:\users\me\desktop\python
中,该文件夹应在桌面上的其他文件夹(C:\users\me\desktop\some-folder
)上执行命令,该文件夹中包含带有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"):
pdf_file_path = os.path.join(root, pdf_file)
os.chdir(root)
call('for %%f in (*.pdf) do @echo %%f')
我得到的结果是“找不到文件”。
答案 0 :(得分:3)
首先,由于您正在激活内置DOS命令,因此您必须设置shell=True
来运行此类命令。
其次,即使它不起作用,因为双重百分比是为脚本保留的。内联命令需要一个%
。
第三:不要使用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)
在列表中传递参数会自动处理文件名中的空格。