【问题标题】:Converting a folder of Excel files into CSV files/Merge Excel Workbooks将 Excel 文件文件夹转换为 CSV 文件/合并 Excel 工作簿
【发布时间】:2014-09-07 06:41:50
【问题描述】:

我有一个包含大量 Excel 工作簿的文件夹。有没有办法使用 Python 的 xlrd、xlutiles 和 xlsxWriter 将这个文件夹中的每个文件转换为 CSV 文件?

我希望新转换的 CSV 文件具有扩展名“_convert.csv”。

否则...

有没有办法将文件夹中的所有 Excel 工作簿合并成一个大文件?

我一直在寻找两种方法都可以做到,但没有任何效果......

【问题讨论】:

    标签: python csv xlrd xlsxwriter


    【解决方案1】:

    使用pywin32,这将在指定目录中找到所有.xlsx 文件,然后将它们打开并重新保存为.csv。使用pywin32 找出正确的命令相对容易...只需记录一个 Excel 宏并手动执行打开/保存,然后查看生成的宏。

    import os
    import glob
    import win32com.client
    
    xl = win32com.client.gencache.EnsureDispatch('Excel.Application')
    
    for f in glob.glob('tmp/*.xlsx'):
        fullname = os.path.abspath(f)
        xl.Workbooks.Open(fullname)
        xl.ActiveWorkbook.SaveAs(Filename=fullname.replace('.xlsx','.csv'),
                                 FileFormat=win32com.client.constants.xlCSVMSDOS,
                                 CreateBackup=False)
        xl.ActiveWorkbook.Close(SaveChanges=False)
    

    【讨论】:

    • 感谢您写出来,但我无法安装 win32com 扩展。这可以通过另一个扩展来完成吗?
    • 我相信它可以。我没有使用你提到的那些,所以我把这个扔在那里,因为我熟悉 pywin32,它让 Excel 完成所有工作。
    【解决方案2】:

    我会试试我的图书馆pyexcel:

    from pyexcel import Book, BookWriter
    import glob
    import os
    
    
    for f in glob.glob("your_directory/*.xlsx"):
        fullname = os.path.abspath(f)
        converted_filename = fullname.replace(".xlsx", "_converted.csv")
        book = Book(f)
        converted_csvs = BookWriter(converted_filename)
        converted_csvs.write_book_reader(book)
        converted_csvs.close()
    

    如果您的 xlsx 有超过 2 个工作表,我想您将生成超过 2 个 csv 文件。命名约定是:“file_converted_%s.csv”% your_sheet_name。该脚本会将所有转换后的 csv 文件保存在您拥有 xlsx 文件的同一目录中。

    另外,如果你想合并所有的东西,也超级简单。

    from pyexcel.cookbook import merge_all_to_a_book
    import glob
    
    
    merge_all_to_a_book(glob.glob("your_directory/*.xlsx"), "output.xlsx")
    

    如果你想做更多,请阅读tutorial

    【讨论】:

      【解决方案3】:

      查看 openoffice 的 python 库。虽然,我怀疑 openoffice 会支持 MS 文档文件。

      Python 不支持 Excel 文件。

      【讨论】:

      • 有很多方法可以在 Python 中处理 Excel 文件:python-excel.org。它们可能不像您希望的那样原生 - 我认为它们不在主要发行版或 PyPI 中,但它们适用于基本任务。
      【解决方案4】:

      当然。使用 glob 之类的东西遍历您的文件,并将它们输入您提到的模块之一。使用 xlrd,您可以使用 open_workbook 按名称打开每个文件。这会给你一个Book object。然后,您将需要嵌套循环来迭代 Book 中的每个 Sheet 对象、Sheet 中的每一行以及 Row 中的每个单元格。如果您的行不太宽,您可以将行中的每个单元格附加到 Python 列表中,然后将该列表提供给 csv.writer objectwriterow 方法。

      由于这是一个高级问题,因此此答案掩盖了一些细节,例如如何调用xlrd.open_workbook 以及如何创建csv.writer。希望在谷歌上搜索有关这些特定点的示例将带您到达您需要去的地方。

      【讨论】:

        【解决方案5】:

        您可以使用此功能从每个文件中读取数据

        import xlrd
        
        def getXLData(Filename, min_row_len=1, get_datemode=False, sheetnum=0):
          Data = []
          book = xlrd.open_workbook(Filename)
          sheet = book.sheets()[sheetnum] 
          rowcount = 0
          while rowcount < sheet.nrows:
            row = sheet.row_values(rowcount)
            if len(row)>=min_row_len: Data.append(row)
            rowcount+=1
          if get_datemode: return Data, book.datemode
          else: return Data
        

        这个函数在你将列表组合在一起后写入数据

        import csv
        
        def writeCSVFile(filename, data, headers = []):
          import csv
          if headers:
            temp = [headers]
            temp.extend(data)
            data = temp
          f = open(filename,"wb")
          writer = csv.writer(f)
          writer.writerows(data)
          f.close()
        

        请记住,您可能需要重新格式化数据,尤其是当 Excel 文件中有日期或整数时,因为它们存储为浮点数。

        编辑添加调用上述函数的代码:

        import glob
        
        filelist = glob.glob("*.xls*")
        alldata = []
        headers = []
        for filename in filelist:
          data = getXLData(filename)
          headers = data.pop(0) # omit this line if files do not have a header row
          alldata.extend(data)
        
        writeCSVFile("Output.csv", alldata, headers)
        

        【讨论】:

        • 你能解释一下这段代码吗?我尝试运行它,但没有得到任何结果...具体来说,我需要将输出(带有组合数据)放在文件夹目录中。
        • 这些是您必须使用其他代码调用的函数。
        猜你喜欢
        • 1970-01-01
        • 2018-11-23
        • 1970-01-01
        • 2011-08-08
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多