2016-07-19 63 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)