2017-03-29 3 views
1

Ich habe dieses kleine Prog erstellt, um alle PDFs in einem Verzeichnis zu suchen, festzustellen, ob sie durchsuchbar sind oder nicht und sie dann in das entsprechende Verzeichnis zu verschieben.Leerzeichen im Dateinamen Python 3.4.2

Ich bin neu in Python und es ist wahrscheinlich nicht der beste Weg, aber es funktioniert, bis der Dateiname hat White Space drin und ich bekomme Folgendes zurück.

Jede Hilfe wäre willkommen.

>>> os.system("pdffonts.exe " + pdfFile + "> output.txt") 
99 



import os 
import glob 
import shutil 
directory = os.chdir("C:\MyDir") # Change working directory 
fileDir = glob.glob('*.pdf') # Create a list of all PDF's in declared directory 
numFiles = len(fileDir) # Lenght of list 
startFile = 0 # Counter variable 
seekWord = "TrueType" 
while startFile < numFiles: 
    pdfFile=fileDir[startFile] 
    os.system("pdffonts.exe " + pdfFile + "> output.txt") 
    file1output = open("output.txt","r") 
    fileContent = file1output.read() 
    if seekWord in fileContent: 
     shutil.move(pdfFile , "NO_OCR") 
    else: shutil.move(pdfFile, "OCR") 
    startFile = startFile + 1 
+0

Versuchen Sie, die Anführungszeichen um den Dateinamen zu entkommen, wie 'os.system ("pdffonts.exe \" "+ pdffile + "\"> output.txt")' –

Antwort

2

os.system() verwendet die Shell, um Ihren Befehl auszuführen. Du müss Zitat Ihre Dateinamen für den Shell-Räume als Teil der Datei zu erkennen, Sie so mit den shlex.quote() function tun können:

os.system("pdffonts.exe " + shlex.quote(pdfFile) + "> output.txt") 

Allerdings gibt es keinen Grund, bei allenos.system() zu verwenden und die Schale. Sie sollten die subprocess.run() function verwenden und konfigurieren, ohne Umleitung oder eine Schale um die Ausgabe zu passieren zurück:

import subprocess 

seekWord = b"TrueType" 
for pdfFile in fileDir: 
    result = subprocess.run(["pdffonts.exe", pdfFile], stdout=subprocess.PIPE) 
    fileContent = result.stdout 
    if seekWord in fileContent: 
     # ... 

Da pdfFile an pdffonts.exe weitergegeben direkt gibt es keine Notwendigkeit nicht über ein Shell-Parsing und Leerzeichen Sorgen mehr Angelegenheiten.

Bitte beachte, dass ich seekWord verändern eine bytes wörtliche zu sein, anstatt als result.stdout ist ein Byte-Wert (keine Notwendigkeit, zu versuchen, um das Ergebnis zu Unicode hier zu dekodieren).

+0

Danke für deine Hilfe. – Mick

0

Es scheint, dass das Problem nicht von Python kommt, sondern die Windows-Shell. Sie müssen in Anführungszeichen setzen. Da ich dein Programm pdffonts.exe nicht habe, kann ich nicht debuggen. Ich habe auch Ihren Code pythonic

import os 
import glob 
import shutil 
directory = os.chdir("C:\MyDir") # Change working directory 
fileDir = glob.glob('*.pdf') # Create a list of all PDF's in declared directory 

seekWord = "TrueType" 
for pdfFile in fileDir: 
    os.system('pdffonts.exe "{0}"> output.txt'.format(pdfFile)) 
    file1output = open("output.txt","r") 
    fileContent = file1output.read() 
    if seekWord in fileContent: 
     shutil.move(pdfFile , "NO_OCR") 
    else: 
     shutil.move(pdfFile, "OCR") 
+0

Was ist, wenn der Dateiname ein Zitat enthält? Dies sind gültige Zeichen in einem Windows-Dateipfad. –

+0

@MartijnPieters Ihre Antwort ist definitiv besser. – Wli

+0

Nun, ich habe gerade überprüft: Doppelzitate funktionieren nicht in Windows-Dateipfaden, also glaube ich nicht, dass es ein Problem ist, wenn es ein einfaches Zitat in pdfFile gibt. – Wli

Verwandte Themen