pandas 读写 Excel

pandas 读写 Excel,可以用于将重复的数据加工工作交给 pandas,节省手工劳动,使用起来也比较方便,但输出的格式并不太美观。本文介绍 read_excel()to_excel() 的部分细节,同时探讨如何输出一个较为美观的 Excel 工作表。

pandas 读取 Excel 文件

语法

DataFrame.read_excel() 的语法:

pandas.read_excel(io, 
                  sheet_name=0, 
                  header=0, 
                  names=None, 
                  index_col=None, 
                  parse_cols=None, 
                  usecols=None, 
                  squeeze=False, 
                  dtype=None, 
                  engine=None, 
                  converters=None, 
                  true_values=None, 
                  false_values=None, 
                  skiprows=None, 
                  nrows=None, 
                  na_values=None, 
                  keep_default_na=True, 
                  verbose=False, 
                  parse_dates=False, 
                  date_parser=None, 
                  thousands=None, 
                  comment=None, 
                  skip_footer=0, 
                  skipfooter=0, 
                  convert_float=True, 
                  mangle_dupe_cols=True, 
                  **kwds)

参数和返回值的说明请参考 pandas 文档

最简单的用法,只需要指定文件名参数,支持 xls 文和 xlsx 文件格式,函数的返回值为 DataFrame 类型的对象。比如读取 D 盘根目录下的 source.xlsx 文件:

import pandas as pd
df1 = pd.read_excel(r'D:/source.xlsx)

如果想读取 py 文件所在目录下的某个 Excel 文件,可以参考下面的代码:

import pandas as pd 
import os

# get path of current directory
curr_path = os.path.dirname(os.path.abspath(__file__))
fname = os.path.join(curr_path, 'users.xlsx')
df2 = pd.read_excel(fname)

指定要读取的工作表

对于有多个工作表的 Excel 文件,pandas 默认读取第一个工作表( sheet_name=0 )。通过如下两种方法可以指定要读取的工作表:

# 方法一:通过 index 指定工作表
df3 = pd.read_excel(file_name, sheet_name=0)

# 方法二:指定工作表名称
df4 = pd.read_excel(file_name, sheet_name='Sheet1')

导入指定列

如果只想导入指定的列,通过 usecols 参数,比如想导入 A:DH 这 4 列,有如下两种方法:

df6 = pd.read_excel(r'D:/source.xlsx', usecols='A:D,H')

# 或者
df6 = pd.read_excel(r'D:/source.xlsx', usecols=[0,1,2,3,7])

指定表头

默认情况下,pandas 假定第一行为表头 (header),如果 Excel 不是从第一行开始,header 参数用于指定将哪一行作为表头,表头在 DataFrame 中变成列索引 (column index) ,header 参数从 0 开始,比如第二行作为 header,则:

df = pd.read_excel(file_name, header=1)

pandas 写入 Excel

语法

DataFrame.to_excel() 的语法:

DataFrame.to_excel(excel_writer, 
                   sheet_name='Sheet1', 
                   na_rep='', 
                   float_format=None, 
                   columns=None, 
                   header=True, 
                   index=True, 
                   index_label=None, 
                   startrow=0, startcol=0, 
                   engine=None, 
                   merge_cells=True, 
                   encoding=None, 
                   inf_rep='inf', 
                   verbose=True, 
                   freeze_panes=None)

参数和返回值的说明请参考 pandas 文档

数据写入 Excel,需要首先安装一个 engine,由 engine 负责将数据写入 Excel,pandas 使用 openpyx 或 xlsxwriter 作为写入引擎。

要将单一对象写入 Excel,只需要指定 file name 即可:

import pandas as pd
import os

path = os.path.dirname(os.path.abspath(__file__))
source_file = os.path.join(path, 'source.xlsx')
output_file = os.path.join(path, 'output.xlsx')

df = pd.read_excel(source_file, sheet_name=0)
df.to_excel(output_file)

如果 output.xlsx 文件已经存在,to_excel()先删除 output.xlsx 文件,然后重新生成一个新的文件,并且默认添加一个索引列,索引为从 0 到 n 的整数。

不使用索引

导出 Excel,一般不需要索引,将 index 参数设为 False 即可:

df.to_excel(output_file, index=False)

多工作表导出

导出多个工作表需要明确给出 excel writer engine,然后调用 DataFrame.to_excel()方法:

import pandas as pd
import os

path = os.path.dirname(os.path.abspath(__file__))
source_file = os.path.join(path, 'source.xlsx')
output_file = os.path.join(path, 'output.xlsx')

df1 = pd.read_excel(source_file, sheet_name=0)
df2 = pd.read_excel(source_file, sheet_name=0, usecols='A:D,H')

with pd.ExcelWriter(output_file, engine='xlsxwriter') as writer:    
    df1.to_excel(writer, sheet_name='Sheet1', index=False)
    df2.to_excel(writer, sheet_name='Sheet2', index=False)

工作表美化

pandas 导出的工作表并不美观,如果想对工作表进行美化的话,可在 to_excel()方法之后,通过Excel writer engine 的格式设置的功能来设置格式。根据测试, to_excel() 因为先删除文件,所以也不能使用 Template 来保存预定义格式。所以如果需要导出有格式的 Excel 文件,比如作为报表输出,可考虑 Template + Excel writer engine 手工代码的方式。

Creating Advanced Excel Workbooks with Python 这篇文章讲到了一个方法,使用 xlsxwriter 的 add_table() 方法,在 Excel 中创建一个 Table 对象(中文经常被称为智能表格),然后选择一个预定义的格式。我对代码进行了加工,使之更具普适性:

import pandas as pd
import os

def get_col_widths(dataframe):    
    return [max([len(str(s))  for s in dataframe[col].values] 
            + [len(col)]) for col in dataframe.columns]

def fmt_excel(writer, sheetname, dataframe):
    # Get the workbook and the summary sheet so we can add the formatting
    workbook = writer.book
    worksheet = writer.sheets[sheetname]
    col_count = dataframe.shape[1]
    row_count = dataframe.shape[0]

    col_names = []
    for i in range(0, col_count):
        col_names.append({'header': dataframe.columns[i]})

    # rng = 'A1:H{}'.format(row_count + 1)
    worksheet.add_table(0, 0, row_count,col_count-1, {
        'columns': col_names,
        'style': 'Table Style Medium 20'
    })

    # auto column size
    col_widths = get_col_widths(dataframe)
    for i, width in enumerate(col_widths):
        worksheet.set_column(i, i, width)

path = os.path.dirname(os.path.abspath(__file__))
source_file = os.path.join(path, 'source.xlsx')
output_file = os.path.join(path, 'output.xlsx')

df = pd.read_excel(source_file, sheet_name=0)

writer = pd.ExcelWriter(output_file, engine='xlsxwriter')
df.to_excel(writer, 'Sheet1', index=False)

fmt_excel(writer, 'Sheet1', df)
writer.save()

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容