xls到csv转换器

我在Python中使用win32.client将我的.xlsx和.xls文件转换为.csv文件。 当我执行这个代码时,它给出了一个错误。 我的代码是:

def convertXLS2CSV(aFile): '''converts a MS Excel file to csv w/ the same name in the same directory''' print "------ beginning to convert XLS to CSV ------" try: import win32com.client, os from win32com.client import constants as c excel = win32com.client.Dispatch('Excel.Application') fileDir, fileName = os.path.split(aFile) nameOnly = os.path.splitext(fileName) newName = nameOnly[0] + ".csv" outCSV = os.path.join(fileDir, newName) workbook = excel.Workbooks.Open(aFile) workbook.SaveAs(outCSV, c.xlCSVMSDOS) # 24 represents xlCSVMSDOS workbook.Close(False) excel.Quit() del excel print "...Converted " + nameOnly + " to CSV" except: print ">>>>>>> FAILED to convert " + aFile + " to CSV!" convertXLS2CSV("G:\\hello.xlsx") 

我无法find这个代码中的错误。 请帮忙。

我会使用xlrd – 它更快,跨平台,并直接与文件。 有一件事要注意 – 它不适用于xlsx文件 – 所以你必须将你的Excel文件保存为xls。 编辑:从版本0.8.0, xlrd读取XLS和XLSX文件。

  import xlrd import csv def csv_from_excel(): wb = xlrd.open_workbook('your_workbook.xls') sh = wb.sheet_by_name('Sheet1') your_csv_file = open('your_csv_file.csv', 'wb') wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL) for rownum in xrange(sh.nrows): wr.writerow(sh.row_values(rownum)) your_csv_file.close() 

也许有人发现这个准备使用的代码有用。 它允许从Excel工作簿中的所有电子表格创buildCSV。

在这里输入图像说明

 # -*- coding: utf-8 -*- import xlrd import csv from os import sys def csv_from_excel(excel_file): workbook = xlrd.open_workbook(excel_file) all_worksheets = workbook.sheet_names() for worksheet_name in all_worksheets: worksheet = workbook.sheet_by_name(worksheet_name) with open('{}.csv'.format(worksheet_name), 'wb') as your_csv_file: wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL) for rownum in xrange(worksheet.nrows): wr.writerow([unicode(entry).encode("utf-8") for entry in worksheet.row_values(rownum)]) if __name__ == "__main__": csv_from_excel(sys.argv[1]) 

我会用pandas 。 计算量大的部分是用cython或c-extensions编写的,以加速这个过程,语法很干净。 例如,如果要将文件“your_workbook.xls”中的“Sheet1”转换为文件“your_csv.csv”,则只需使用顶级函数read_excelDataFrame类中的方法to_csv ,如下所示:

 import pandas as pd data_xls = pd.read_excel('your_workbook.xls', 'Sheet1', index_col=None) data_xls.to_csv('your_csv.csv', encoding='utf-8') 

设置encoding='utf-8'缓解其他答案中提到的UnicodeEncodeError

我会使用csvkit ,它使用xlrd(用于xls)和openpyxl(用于xlsx)将几乎任何表格数据转换为csv。

一旦安装,依赖,这是一个问题:

 python in2csv myfile > myoutput.csv 

它处理所有的格式检测问题,所以你可以传递它几乎任何表格数据源。 它也是跨平台的(没有win32依赖)。

@andi我testing了你的代码,它工作的很好,但是

在我的床单上有一个这样的列

2013-03-06T04:00:00

date和时间在同一个单元格中

输出时出现乱码,在导出的文件中就是这样

41275.0416667

其他列是好的。

另一方面,csvkit与该列确实无关,但只导出一张表,而我的文件有很多。

xlsx2csv比pandas和xlrd

 xlsx2csv -s 0 crunchbase_monthly_.xlsx cruchbase 

excel文件通常带有n个sheetname。

 -s is sheetname index. 

然后,将创buildcruchbase文件夹,每个属于xlsx的工作表将被转换为单个csv。

ps csvkit也很棒。

使用xlrd是一个有缺陷的方法,因为您在Excel中丢失了date格式。

我的用例如下。

把一个Excel文件与多个工作表,并将其转换成一个自己的文件。

我已经完成了这个使用xlsx2csv库和调用这个使用subprocess。

 import csv import sys, os, json, re, time import subprocess def csv_from_excel(fname): subprocess.Popen(["xlsx2csv " + fname + " --all -d '|' -i -p " "'<New Sheet>' > " + 'test.csv'], shell=True) return lstSheets = csv_from_excel(sys.argv[1]) time.sleep(3) # system needs to wait a second to recognize the file was written with open('[YOUR PATH]/test.csv') as f: lines = f.readlines() firstSheet = True for line in lines: if line.startswith('<New Sheet>'): if firstSheet: sh_2_fname = line.replace('<New Sheet>', '').strip().replace(' - ', '_').replace(' ','_') print(sh_2_fname) sh2f = open(sh_2_fname+".csv", "w") firstSheet = False else: sh2f.close() sh_2_fname = line.replace('<New Sheet>', '').strip().replace(' - ', '_').replace(' ','_') print(sh_2_fname) sh2f = open(sh_2_fname+".csv", "w") else: sh2f.write(line) sh2f.close() 

我已经testing了所有的声音,但是对我来说,它们太慢了。 如果您安装了Excel,则可以使用COM。

我想最初它会更慢,因为它会加载实际的Excel应用程序的一切,但它不是大文件。 也许是因为打开和保存文件的algorithm运行了大量优化的编译代码,毕竟微软为它赚了很多钱。

 import sys import os import glob from win32com.client import Dispatch def main(path): excel = Dispatch("Excel.Application") if is_full_path(path): process_file(excel, path) else: files = glob.glob(path) for file_path in files: process_file(excel, file_path) excel.Quit() def process_file(excel, path): fullpath = os.path.abspath(path) full_csv_path = os.path.splitext(fullpath)[0] + '.csv' workbook = excel.Workbooks.Open(fullpath) workbook.Worksheets(1).SaveAs(full_csv_path, 6) workbook.Saved = 1 workbook.Close() def is_full_path(path): return path.find(":") > -1 if __name__ == '__main__': main(sys.argv[1]) 

这是非常原始的代码,不会检查错误,打印帮助或任何东西,它只会为每个文件创build一个csv文件,以匹配您在函数中input的模式,这样您可以批量处理大量文件,只启动Excel应用程序一旦。