关于python读写csv表格的例子

CSV (Comma Separated Values) 格式是电子表格和数据库中最常见的输入、输出文件格式。

python csv 模块实现了 CSV 格式表单数据的读写。

csv 模块中的 reader 类和 writer 类可用于读写序列化的数据。也可使用 DictReader 类和 DictWriter 类以字典的形式读写数据。

本文和之前excel的处理有点像,就是基于某些通用字段对csv文件进行切割,还要考虑到缺了这个通用字段的场景,该字段某个值为空的场景。

详细参考见:https://docs.python.org/zh-cn/3/library/csv.html

617fe1ed7e6d08458f0070e02ff6f2ad.png

writer类可用于写序列化的数据

DictWriter类以字典的形式写数据,创建一个对象,该对象在操作上类似常规 writer,但会将字典映射到输出行。

reader类可用于读序列化的数据

DictReader类以字典的形式读数据,创建一个对象,该对象在操作上类似常规 reader,但会将字典映射到输出行。

# 对从系统中导出来的文件按照“局数据”中的分公司进行分割
# 这些文件有一个共同的特性,都有“局数据”字段,但分公司不完全都有数据
# 部分文件缺乏“局数据”字段
# 举例
# xxx.csv  ->xxx_广州分公司.csv,xxx_上海分公司.csv
# yyy.csv  ->yyy_广州分公司.csv,yyy_武汉分公司.csv
# zzz.csv  ->zzz_广州分公司.csv,zzz_上海分公司.csv,yyy_武汉分公司.csv,yyy_天津分公司.csv
# 表格中部分数据为null值,需要单独写入一个文件
import csv
import os
import pandas as pd
import codecs
# 获取待转换文件的文件夹路径
curpath = 'C:\\Users\\baoqi\\Documents\\【广州】学习材料\\海南数据治理\\问题数据清单\\'
# 获取当前文件夹下的文件列表
allfile = os.listdir(curpath)
for filename in allfile:
    # 拼接路径及文件
    filesegname = filename.split('.')[0]
    pathfilename = curpath + filename
    # 如果当前为文件夹对象,则跳过
    if os.path.isdir(pathfilename):
        continue
    # 读取csv文件
    xlsdatalist = []  # 暂存当前excel表的数据
    sheettitle = []  # 暂储当前excel表的表头
    orglist=[]  # 存当前表格的地市公司名称
    csv_data = pd.read_csv(pathfilename,encoding='gbk')
    if '地市局(dsj)' in csv_data.columns:
        orglist=list(csv_data['地市局(dsj)'].unique())
        orglist = [a_ for a_ in orglist if a_ == a_]
    else:
        continue
    # 打开当前csv文件,读取数据写入不同list,同时将不规则数据直接写入文件
    with open(pathfilename) as f:
        # 获取数据流
        reader = csv.DictReader(f)
        # 获取字段名称
        sheettitle=reader.fieldnames
        # 拼接相关文件
        csvwritefile = curpath + filesegname + '_.csv'
        # 写入不规则数据文件
        with open(csvwritefile, 'w', newline='') as csvfile:
            # 写入标题
            writer = csv.DictWriter(csvfile, fieldnames=sheettitle)
            writer.writeheader()
            # 读取数据
            for row in reader:
                # 满足分类要求,则写入list,不满足要求直接写入文件
                if row['地市局(dsj)'] !='':
                    xlsdatalist.append([row['地市局(dsj)'],row])
                else:
                    writer.writerow(row)

    for orgname in orglist:
        # 拼接文件名
        csvwritefile = curpath + filesegname + '_' + orgname.replace("'",'') + '.csv'
        with open(csvwritefile, 'w', newline='') as csvfile:
            # 写入标题
            writer = csv.DictWriter(csvfile, fieldnames=sheettitle)
            writer.writeheader()
            # 写入数据
            for data in xlsdatalist:
                # 满足当前分类条件,写入相关数据
                if data[0]==orgname:
                    writer.writerow(data[1])

本文也结合了pandas提取单位的唯一值,且剔除掉了nan值,此外关于csv的标题读写,内容读写的类只是浅尝辄止。涉及字符集编码方面也未做太多说明。有兴趣的可以看一下官网说明。

d2a18d7cd0528c63c964b513e9cc47de.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python与大数据分析

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值