python 读取excel的所有工作表并保存为csv

因为excel2013打开文件时经常出现“正在联系......”大约需要半小时左右才能打开,所以就想不用excel打开,直接用python把excel转换为csv后再打开。网上搜了一下,大部分解决方案是用pandas,代码非常简洁:

import pandas as pd

data = pd.read_excel('1.xlsx',sheet_name=0,index_col=0)

data.to_csv('1.csv',encoding='utf-8')

pandas代码真是太简洁了,可是实际使用时却发现,pandas只能读取excel的第一个sheet,不管sheet_name赋几,保存的csv都是第一个sheet的内容。查了很多资料也没能解决这个问题。

换个思路吧,Python读取excel还有另外一种方式就是xlrd(写入excel是xlwt),经过努力xlrd终于成功读取并保存了所有sheet,代码如下:

import xlrd
import csv
import codecs
import argparse
import os
import time

def args_parse():
    # construct the argument parse and parse the arguments
    ap = argparse.ArgumentParser()
    ap.add_argument("-f", "--file", 
                    required=True,
                    help="excel file name")
    args = vars(ap.parse_args()) 
    return args

def xlsx_to_csv_pd(filepath):
    (filedir, filename) = os.path.split(filepath)
    (fn, ext) = os.path.splitext(filename)
    workbook = xlrd.open_workbook(filepath)
    sheets = workbook.sheet_names()
    for i in range(len(sheets)):
        table = workbook.sheet_by_index(i)
        sht = fn + '_' + sheets[i] + '.csv'
        with codecs.open(sht, 'w', encoding='UTF-8') as f:
            write = csv.writer(f)
            for row_num in range(table.nrows):
                row_value = table.row_values(row_num)
                write.writerow(row_value)
        print(sht," created!")
        
if __name__=='__main__':
    st = time.time()
    args = args_parse()
    filepath = args['file']
    xlsx_to_csv_pd(filepath)
    print("Completed to convert ",filepath," to csv files!")
    nd = time.time()
    tm = nd - st
    print("Spend time: ",tm,"s")

执行方法: 

python excel2csv.py -f 文件名

保存为csv文件名是excel文件名_sheet名.csv

xlrd是anconda默认安装的库,不需要另外安装。

注意: excel2010打开csv文件时默认是以utf-8字符集打开,excel2013却是,ANSI,所以保存csv文件时注意修改字符集。

 

你可能感兴趣的:(python)