2017-02-17 148 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

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

相关问题