2016-07-19 122 views
2

我想將所有.doc文件從特定文件夾轉換爲.docx文件。使用python將多個.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:[錯誤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的機器上沒有工作的其他解決方案給了我同樣的錯誤 –

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

此代碼的工作在Ubuntu但不是在Windows – pyd

+0

從我的測試,這只是失敗當有問題的工作/目標目錄是文件系統的根目錄時,例如直接使用''C:\''或''D:\''。任何其他文件夾工作正常。看起來像「soffice」中的一個bug。您可以使用選項'--outdir '來指定輸出目錄。 –

+0

我需要傳一個參數嗎?你能編輯你的答案嗎? – 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

這是一個適合我的解決方案。建議使用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) 
相關問題