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

1 投票
5 回答
3771 浏览
提问于 2025-04-18 13:34

我有一个文件夹,里面有很多Excel工作簿。有没有办法用Python的xlrd、xlutils和xlsxWriter把这个文件夹里的每个文件都转换成CSV文件?

我希望新转换的CSV文件名后面加上'_convert.csv'这个后缀。

否则……

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

我一直在找方法来做这两件事,但都没有成功……

5 个回答

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)
0

当然可以。你可以用类似 glob 的工具来遍历你的文件,然后把这些文件传给你提到的某个模块。使用 xlrd 的话,你可以用 open_workbook 来按名字打开每个文件。这样你就会得到一个 Book 对象。接下来,你需要用嵌套循环来遍历这个 Book 里的每个 Sheet 对象、每个 Sheet 里的每一行,以及每一行里的每个单元格。如果你的行不太宽,你可以把每一行的单元格添加到一个 Python 列表中,然后把这个列表传给 writerow 方法,使用一个 csv.writer 对象

因为这是个比较高层次的问题,所以这个回答没有详细说明如何调用 xlrd.open_workbook 和如何创建 csv.writer。希望你能通过谷歌搜索这些具体点的例子,找到你需要的信息。

0

看看OpenOffice的Python库。虽然我怀疑OpenOffice是否支持微软的文档文件。

Python本身并不支持Excel文件。

1

我来试试用我的库 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 文件,我想你会生成超过两个 csv 文件。文件命名规则是:“file_converted_%s.csv” % 你的工作表名称。这个脚本会把所有转换后的 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")

如果你想了解更多,请查看这个 教程

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)

撰写回答