すべての.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]そのようなファイルまたはディレクトリはありません
これが私のために働いた解決策です。提案された他のソリューションは、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)
私はそのようなタスクに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()
使用する 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])