web-dev-qa-db-ja.com

python)を使用した複数の.docから.docxファイルへの変換

すべての.docファイルを特定のフォルダーから.docxファイルに変換したいと思います。

次のコードを使ってみましたが、

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:[Errno2]そのようなファイルまたはディレクトリはありません

6
sunil pawar

これが私のために働いた解決策です。提案された他のソリューションは、Python 3を使用する私のWindows10マシンでは機能しませんでした。

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)
6
dshefman

私はそのようなタスクに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])

サブプロセス呼び出しに依存したくない場合は、COMクライアントを使用したバージョンを次に示します。 LibreOfficeがインストールされていないWindowsユーザーをターゲットにしている場合に便利です。

#!/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()
0
James Parker

使用する 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
p-robot