用Python一步读写csv、xlsx表格

需求

python的内置库csv提供了读写csv表格的方法,第三方库openpyxl 提供了读写xlsx表格的方法。
不过,为了避免每次调用这些库时都要回忆其用法,笔者将基本的读写操作封装成函数——通过python的list类型直接读写csv、xlsx表格文件,不需考虑格式等细节。

代码

def read_csv(filename, *args, **kwargs):
    """
    从一个csv文件中读取每行数据,返回一个二维列表、
      - 基于csv模块。
      - 该函数的参数列表与open()相同。
    """
    import csv
    result = []
    with open(filename, *args, **kwargs) as f:
        csv_reader = csv.reader(f)   # 在一个文件流f上创建csv阅读器
        try:
            for line in csv_reader:  # 迭代csv_reader的内容
                result.append(line)
        except csv.Error as e:       # 捕捉读取csv文件时的异常
            raise OSError("A reading error in file {}, line {}:\n{}"
                          .format(filename, csv_reader.line_num, e))
    return result


def write_csv(data, filename, mode='w', newline='', **kwargs):
    """ 
    将数据(比如二维列表)转换成csv格式,再保存到指定文件中。
      - 基于csv模块。
    """
    import csv
    with open(filename, mode, newline=newline, **kwargs) as f:
        csv_writer = csv.writer(f)  # 在文件流f上创建一个csv写入器
        csv_writer.writerows(data)  # 写入多行


def read_xlsx(filename, read_only=True, *args, **kwargs):
    """
    读取一个xlsx表格中的全部数据,保存为一个字典返回。
      - 该字典的key为xlsx中一个sheet的名字,value为该sheet的所有行组成的list。
      - 该函数的参数与 openpyxl.load_workbook() 相同。
      - read_only=True 表示以只读模式打开,读取速度更快。
    """
    from openpyxl import load_workbook
    wb = load_workbook(filename, read_only, *args, **kwargs)
    data_dict = {}
    # 遍历xlsx中的每个sheet,遍历每个sheet中的每行数据,保存为字典类型
    for name in wb.sheetnames:
        data_dict[name] = [row for row in wb[name].values]
    wb.close()
    return data_dict


def write_xlsx(data_dict, filename, write_only=True):
    """
    将一个字典写入xlsx表格。
      - 如果输入的data不是字典类型,会先转换成 key="Sheet1" 的字典。
      - 该字典的key为xlsx中一个sheet的名字,value为该sheet的所有行组成的list。
      - write_only=True 表示以只写模式打开,读取速度更快。
    """
    from openpyxl import Workbook

    if not isinstance(data_dict, dict):
        data_dict = {"Sheet1": data_dict}

    wb = Workbook(data_dict, write_only)
    # 遍历data_dict中的每个value,遍历每个value的每行数据,保存为xlsx表格
    for k, v in data_dict.items():
        ws = wb.create_sheet(k)
        for row in v:
            ws.append(row)
    wb.save(filename)
    wb.close()

测试

    # 编造数据
    data = [[1, 2, 3],
            [4, 5, 6]]
	# 读写csv
    write_csv(data, "1.csv")
    for line in read_csv("1.csv"):
        print(line)

    # 编造数据
    dict_data = {"sheet1": data,
                 "sheet2": data}
    # 读写xlsx
    write_xlsx(dict_data, "1.xlsx")
    for k, v in read_xlsx("1.xlsx").items():
        print(k, v)

csv表格的保存结果:
在这里插入图片描述
xlsx表格的保存结果:
在这里插入图片描述
终端的显示结果:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值