将文件夹中的Excel文件转换为CSV文件/合并Excel工作簿
我有一个文件夹,里面有很多Excel工作簿。有没有办法用Python的xlrd、xlutils和xlsxWriter把这个文件夹里的每个文件都转换成CSV文件?
我希望新转换的CSV文件名后面加上'_convert.csv'这个后缀。
否则……
有没有办法把文件夹里的所有Excel工作簿合并成一个大文件?
我一直在找方法来做这两件事,但都没有成功……
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)
当然可以。你可以用类似 glob 的工具来遍历你的文件,然后把这些文件传给你提到的某个模块。使用 xlrd 的话,你可以用 open_workbook 来按名字打开每个文件。这样你就会得到一个 Book 对象。接下来,你需要用嵌套循环来遍历这个 Book 里的每个 Sheet 对象、每个 Sheet 里的每一行,以及每一行里的每个单元格。如果你的行不太宽,你可以把每一行的单元格添加到一个 Python 列表中,然后把这个列表传给 writerow
方法,使用一个 csv.writer 对象。
因为这是个比较高层次的问题,所以这个回答没有详细说明如何调用 xlrd.open_workbook
和如何创建 csv.writer
。希望你能通过谷歌搜索这些具体点的例子,找到你需要的信息。
看看OpenOffice的Python库。虽然我怀疑OpenOffice是否支持微软的文档文件。
Python本身并不支持Excel文件。
我来试试用我的库 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")
如果你想了解更多,请查看这个 教程
使用 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)