【问题标题】:multiple .doc to .docx file conversion using python使用 python 将多个 .doc 文件转换为 .docx 文件
【发布时间】:2016-07-19 21:00:00
【问题描述】:

我想将特定文件夹中的所有 .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] 没有这样的文件或目录

【问题讨论】:

    标签: python .doc


    【解决方案1】:

    这是一个对我有用的解决方案。提出的其他解决方案不适用于我使用 Python 3 的 Windows 10 机器。

    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)
    

    【讨论】:

    • 我收到此错误 --> com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft Word', "抱歉,我们找不到您的文件。它被移动了吗? 、重命名还是删除?\r (C:\\//Users/shreyajain/Documents/Docum...)", 'wdmain11.chm', 24654, -2146823114), None) 有什么建议吗?
    • @Shreyansjain 根据错误消息,我猜您输入的文件路径不正确。虽然,如果不看你的代码就很难分辨。
    • 1) 这也允许您将 PDF 文件转换为 DOCX,让您可以阅读 PDF 文档的内容。 2)我建议在程序开始时添加一个TRY,以检查是否安装了MS-Word:MSWord_OK = True try: word = win32.gencache.EnsureDispatch('Word.Application')
    【解决方案2】:

    基于dshefman的代码,

    import re
    import os
    import sys
    import win32com.client as win32
    from win32com.client import constants
    
    # Get path from command line argument
    ABS_PATH = sys.argv[1]
    
    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)
    
    def main():
        source = ABS_PATH
    
        for root, dirs, filenames in os.walk(source):
            for f in filenames:
                filename, file_extension = os.path.splitext(f)
    
                if file_extension.lower() == ".doc":
                    file_conv = os.path.join(root, f)
                    save_as_docx(file_conv)
                    print("%s ==> %sx" %(file_conv,f))
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      【解决方案3】:

      如果你不喜欢依赖子进程调用,这里是带有 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()
      

      【讨论】:

      • 很干净。但是,我想知道是否有任何独立于平台的方式将 doc 转换为 docx?
      • @longbowking 去年我看的时候没有瑞士刀库来处理这个问题。一种可能的方法是使用sys.platform 检测操作系统并尝试Jan Christoph Terasa 的Linux 方法,我的Windows 方法。不确定什么适用于 Mac。
      • 刚刚用this docker image, doc -> docx 尝试了 unoconv,但生成的 docx 已损坏(文件包含我需要保留的 cmets)。
      【解决方案4】:

      我更喜欢将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])
      

      虽然理想情况下你会将扩展留给 shell 本身,并使用文件作为参数调用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])
      

      【讨论】:

      • 从我的测试来看,这只在工作/目标目录是文件系统的根目录时才会失败,例如直接C:\ 或D:\。任何其他文件夹都可以正常工作。看起来像 soffice 中的一个错误。您可以使用选项--outdir &lt;directory-name&gt; 指定输出目录。
      • 我需要再传递一个参数吗?你能编辑你的答案吗
      【解决方案5】:

      使用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])
      

      【讨论】:

        猜你喜欢
        • 2011-10-03
        • 1970-01-01
        • 2012-05-11
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多