2016-07-19 7 views
2

Ich möchte alle DOC-Dateien aus einem bestimmten Ordner in DOCX-Datei konvertieren.mehrere .doc zu .docx Dateikonvertierung mit Python

ich den folgenden Code versucht, mit,

import subprocess 
import os 
for filename in os.listdir(os.getcwd()): 
    if filename.endswith('.doc'): 
     print filename 
     subprocess.call(['soffice', '--headless', '--convert-to', 'docx', filename]) 

Aber es gibt mir eine Fehlermeldung: OSError: [Errno 2] Datei oder Verzeichnis

Antwort

0

Verwenden os.path.join das richtige Verzeichnis angeben.

import os, subprocess 

main_dir = os.path.join('/', 'Users', 'username', 'Desktop', 'foldername') 

for filename in os.listdir(main_dir): 
    if filename.endswith('.doc'): 
     print filename 
     subprocess.call(['soffice', '--headless', '--convert-to', 'docx', filename]) 
+0

es hat nicht geholfen ... gab mir den gleichen Fehler –

1

Ich ziehe das glob Modul für Aufgaben wie das verwenden. Legen Sie dies in eine Datei doc2docx.py. Um es ausführbar zu machen, setze chmod +x. Und füge diese Datei optional in deine $PATH ein, um sie "überall" verfügbar zu machen.

#!/usr/bin/env python 

import glob 
import subprocess 

for doc in glob.iglob("*.doc"): 
    subprocess.call(['soffice', '--headless', '--convert-to', 'docx', doc]) 

Obwohl ideal Sie die Expansion selbst an die Shell verlassen würde, und doc2docx.py mit den Dateien als Argumente nennen, wie doc2docx.py *.doc:

#!/usr/bin/env python 

import subprocess 
import sys 

if len(sys.argv) < 2: 
    sys.stderr.write("SYNOPSIS: %s file1 [file2] ...\n"%sys.argv[0]) 

for doc in sys.argv[1:]: 
    subprocess.call(['soffice', '--headless', '--convert-to', 'docx', doc]) 

Wie @pyd fordert, zu einem Ziel zur Ausgabe Verzeichnis myoutputdir Verwendung:

#!/usr/bin/env python 

import subprocess 
import sys 

if len(sys.argv) < 2: 
    sys.stderr.write("SYNOPSIS: %s file1 [file2] ...\n"%sys.argv[0]) 

for doc in sys.argv[1:]: 
    subprocess.call(['soffice', '--headless', '--convert-to', 'docx', '--outdir', 'myoutputdir', doc]) 
+0

dieser Code in Ubuntu funktioniert, aber nicht in den Fenstern – pyd

+0

Von meinen Tests dies nur versagt wenn das betreffende Arbeits-/Zielverzeichnis die Wurzel des Dateisystems ist, z direkt '' C: \ '' oder '' D: \ ''. Jeder andere Ordner funktioniert einwandfrei. Sieht aus wie ein Fehler in '' soffice''. Sie können das Ausgabeverzeichnis mit der Option '--outdir ' angeben. –

+0

Muss ich noch ein Argument übergeben? kannst du deine Antwort bearbeiten? – pyd

0

Wenn Sie nicht gerne verlassen sich auf Unterprozess Anrufe, hier ist die Version mit COM-Client. Dies ist nützlich, wenn Sie Windows-Benutzer ohne LibreOffice installieren möchten.

#!/usr/bin/env python 

import glob 
import win32com.client 

word = win32com.client.Dispatch("Word.Application") 
word.visible = 0 

for i, doc in enumerate(glob.iglob("*.doc")): 
    in_file = os.path.abspath(doc) 
    wb = word.Documents.Open(in_file) 
    out_file = os.path.abspath("out{}.docx".format(i)) 
    wb.SaveAs2(out_file, FileFormat=16) # file format for docx 
    wb.Close() 

word.Quit() 
1

Hier ist eine Lösung, die für mich arbeitete. Die anderen Lösungen vorgeschlagen hat nicht funktioniert auf meiner Windows-10-Maschine mit Python 3.

from glob import glob 
import re 
import os 
import win32com.client as win32 
from win32com.client import constants 

# Create list of paths to .doc files 
paths = glob('C:\\path\\to\\doc\\files\\**\\*.doc', recursive=True) 

def save_as_docx(path): 
    # Opening MS Word 
    word = win32.gencache.EnsureDispatch('Word.Application') 
    doc = word.Documents.Open(path) 
    doc.Activate() 

    # Rename path with .docx 
    new_file_abs = os.path.abspath(path) 
    new_file_abs = re.sub(r'\.\w+$', '.docx', new_file_abs) 

    # Save and Close 
    word.ActiveDocument.SaveAs(
     new_file_abs, FileFormat=constants.wdFormatXMLDocument 
    ) 
    doc.Close(False) 

for path in paths: 
    save_as_docx(path)