将Excel文件的文件夹转换为CSV文件/合并Excel工作簿

时间:2014-07-16 16:20:12

标签: python csv xlrd xlsxwriter

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

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

,否则...

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

我一直在寻找两种方法,但没有任何效果......

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

Python对Excel文件没有本机支持。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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)

答案 4 :(得分:0)

我将尝试使用我的库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