2016-07-19 10 views
2

Я хочу преобразовать все .doc-файлы из определенной папки в файл .docx.преобразование нескольких файлов .doc в .docx с использованием python

Я попытался, используя следующий код,

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]) 

Но это дает мне ошибку: OSError: [Errno 2] Нет такого файла или каталога

ответ

0

Используйте os.path.join чтобы указать правильный каталог.

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

Оно не помогло ... дал мне ту же ошибку –

1

Я предпочитаю использовать модуль glob для выполнения таких задач. Поместите это в файл doc2docx.py. Чтобы сделать его исполняемым, установите chmod +x. И, возможно, поместите этот файл в свой $PATH, чтобы он был доступен «везде».

#!/usr/bin/env python 

import glob 
import subprocess 

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

Хотя в идеале вы бы оставить расширение до самой оболочки и вызвать doc2docx.py с файлами в качестве аргументов, как 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]) 

По просьбе @pyd, для вывода на цель каталог myoutputdir использование:

#!/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

этот код работает в убунту, но не в окнах – pyd

+0

Из моих тестах это только не когда рабочий/целевой каталог является корнем файловой системы, например непосредственно '' C: \ '' или '' D: \ ''. Любая другая папка работает нормально. Похож на ошибку в '' soffice''. Вы можете указать выходной каталог, используя опцию '--outdir <имя_каталога>'. –

+0

Мне нужно передать еще один аргумент? вы можете отредактировать свой ответ – pyd

0

Если вам не нравится полагаться на суб-технологических вызовов, вот версия с COM-клиентом. Это полезно, если вы нацеливаете пользователей Windows без установленного LibreOffice.

#!/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

Вот решение, которое сработало для меня. Другие предложенные решения не работает на моем Windows 10 машине с помощью 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) 
Смежные вопросы