2016-07-19 16 views
2

すべての.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の正しいディレクトリを指定するには、[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

を使用して、私のWindows 10マシン上で動作しませんでした...このコードは、Ubuntuの中で動作しますが、ウィンドウに私のテストから –

1

このようなタスクにはglobモジュールを使用することをお勧めします。これをファイルdoc2docx.pyに入れてください。実行可能にするには、chmod +xと設定します。必要に応じてそのファイルを$PATHに入れて、どこでも利用できるようにします。理想的にあなたがシェル自体への拡張を残し、そしてdoc2docx.py *.docのように、引数としてファイルをdoc2docx.pyを呼びたいけど

#!/usr/bin/env python 

import glob 
import subprocess 

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

ターゲットに出力する、@pydによって要求されたよう
#!/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]) 

ディレクトリ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

を与えました問題の作業ディレクトリ/ターゲットディレクトリがファイルシステムのルートである場合直接 '' C:\ ''または '' D:\ ''になります。他のフォルダは正常に動作します。 '' soffice''のバグのようです。 '--outdir 'オプションを使って出力ディレクトリを指定できます。 – pyd

+0

は、この唯一の失敗ではない私に同じエラー –

+0

もう1つの引数を渡す必要がありますか?あなたの答えを編集できますか? – pyd

0

、ここでの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() 
1

ここで私のために働いた解決策です。提案されている他のソリューションは、それが助けたdidntの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) 
関連する問題