CSV (Comma Separated Values) 格式是电子表格和数据库中最常见的输入、输出文件格式。
python csv 模块实现了 CSV 格式表单数据的读写。
csv 模块中的 reader 类和 writer 类可用于读写序列化的数据。也可使用 DictReader 类和 DictWriter 类以字典的形式读写数据。
本文和之前excel的处理有点像,就是基于某些通用字段对csv文件进行切割,还要考虑到缺了这个通用字段的场景,该字段某个值为空的场景。
详细参考见:https://docs.python.org/zh-cn/3/library/csv.html
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的标题读写,内容读写的类只是浅尝辄止。涉及字符集编码方面也未做太多说明。有兴趣的可以看一下官网说明。