Python实现将字典(列表按列)存入csv文件
作者:尼恩久
这篇文章主要介绍了Python实现将字典(列表按列)存入csv文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
主要用了pandas的to_csv()的方法来写入csv。
先将字典转换成 DataFrame类型数据,然后使用DataFrame.to_csv()即可完成存储。
1、将字典存入csv文件
import pandas as pd dic1 = {'学号': [6812, 6952, 6905], '姓名': ['一', '二', '三'], '排名': [1, 6, 9]} df = pd.DataFrame(dic1, index=range(0, 3)) df.to_csv('last.csv', index=False, encoding='gbk')
结果:
2、列表按列存入csv文件
主要思想:
把需要按列存入的列表当成字典的值存入,键写“名称”即可;逗号间隔列表。
例如:
想把4个列表“按列”写入csv文件,整合好写入字典,再将字典转换成DataFrame类型数据。
week1 = ['一', '二', '三', '四', '五', '六', '七'] weekSpend = [50, 40, 30, 60, 45, 55, 67] day1 = ['m', 't', 'w', 'tu', 'f', 's', 'su'] daySpend = [10, 20, 30, 40, 10, 20, 22] DF = {'weekName': week1, 'weekSpend': weekSpend, 'dayName': day1, 'daySpend': daySpend} trydf = pd.DataFrame(DF) trydf.to_csv('df1.csv', index=False, encoding='gbk', mode='a')
按列追加运行结果结果:
3、反例(没转字典就只有一列)
如果把每个列表仅转换成DataFrame类型数据,追加写入csv,会发现写入都是在整列后面写入
如下演示:
week1 = ['一', '二', '三', '四', '五', '六', '七'] weekSpend = [50, 40, 30, 60, 45, 55, 67] day1 = ['m', 't', 'w', 'tu', 'f', 's', 'su'] daySpend = [10, 20, 30, 40, 10, 20, 22] try2df1 = pd.DataFrame(week1) try2df2 = pd.DataFrame(weekSpend) try2df3 = pd.DataFrame(day1) try2df4 = pd.DataFrame(daySpend) try2df1.to_csv('df2.csv', index=False, encoding='gbk', mode='a') try2df2.to_csv('df2.csv', index=False, encoding='gbk', mode='a') try2df3.to_csv('df2.csv', index=False, encoding='gbk', mode='a') try2df4.to_csv('df2.csv', index=False, encoding='gbk', mode='a')
运行结果:
(提一嘴,发现这里一上面有个headers为0,不想要,可以加入参数:(header=None)
即:
pd1.to_csv('save.csv', encoding='gbk', index=False, header=None) # 里面有中文就用gbk
实战需求
需求1
将磁力文本存入csv表格中,便于统计下载情况和备注
我的文本格式是:
S-003
magnet:?xt=urn:btih:12345678BAG
S-123 小王
magnet:?xt=urn:btih:123456AGGAS小王
magnet:?xt=urn:btih:123456AGGAS解释一下:S-123是序号,而小王是视频名称.
然后我希望csv第一列是编号,第二列是名称,第三列才是磁力。
实现源码
import re import pandas as pd with open('李连jie.txt', 'r', encoding='utf-8') as f: data_ = f.readlines() save_list = [] def to_scv_(): print(data_) temp_tup = [] for i in data_: find_name_1 = re.findall('([a-zA-Z]+-\d+)\n', i) # 匹配编号的行(只有编号) if len(find_name_1): print(find_name_1) temp_tup.append(find_name_1[0]) temp_tup.append('') # 无名 else: find_name_2 = re.findall('([a-zA-Z]+-\d+) (.*?)\n', i) # 匹配名称的行(匹配中文)(只有名称) if len(find_name_2): print(find_name_2) temp_tup.append(find_name_2[0][0]) temp_tup.append(find_name_2[0][1]) # 顺序不能反,因为2中也有中文,还有编号,所以2查询在前 else: find_name_3 = re.findall('([\u4e00-\u9fa5]+)\n', i) # 匹配编号 名称的行(编号,名称都有) if len(find_name_3): print(find_name_3) temp_tup.append('') # 无编号 temp_tup.append(find_name_3[0]) magnet_ = re.findall('(magnet:.*?)\n', i) # 匹配磁力 if len(magnet_): temp_tup.append(magnet_[0]) save_list.append(temp_tup) temp_tup = [] # 只有在追加完名称,现在加完磁力才是一个完整的list,这时才清空 print(save_list) for i in save_list: print(i) save_dic = ({'编号': row[0], '名称': row[1], '磁力链接': row[2]} for row in save_list) pd1 = pd.DataFrame(save_dic) pd1.to_csv('mysave.csv', encoding='gbk', index=False, header=None) to_scv_()
下面备忘录:
需求2
将两个分开的csv文件读取后,合并在一起
之前的需求:(绩点文件)优化后的代码:
import pandas as pd data = pd.read_csv('newdata.csv', encoding='utf-8') # 包含成绩等数据,但不包含班级信息 stu_class = pd.read_csv('班级.csv', encoding='utf-8') # 仅包含班级和姓名的数据 # 使用 merge 函数根据姓名进行合并 merged_data = pd.merge(stu_class, data, on='姓名') # 选择需要的列并重命名 result = merged_data[['姓名', '班级', '体测成绩', '学年平均学分绩点', '综合测评总分排名', '综合测评总分(百分制、精确到小数点后4位)', '学业成绩考核排名']] result.columns = ['姓名', '班级', '体测', '绩点', '绩点排名', '综测得分', '综测排名'] # 将结果保存为 CSV 文件 result.to_csv('最终文件.csv', index=False, encoding='gbk')
(绩点文件) 之前的代码
import pandas as pd data = pd.read_csv('newdata.csv', encoding='utf-8') # 含有成绩等的数据,但是没有班级信息 stu_class = pd.read_csv('班级.csv', encoding='utf-8') # 仅含有班级和姓名的数据 dic = {} score_index = 0 # 包含学生成绩的数据索引 class_index = -1 # 包含学生班级的数据索引 for name in stu_class['姓名']: class_index += 1 for stu_score in data['姓名']: if score_index == len(data): score_index = 0 break elif name != stu_score: score_index += 1 continue elif name == stu_score: # 这里需要特别注意:班级跟成绩不是同一个index dic[name] = (stu_class['班级'][class_index][6:7], data['体测成绩'][score_index], data['学年平均学分绩点'][score_index], data['综合测评总分排名'][score_index], data['综合测评总分(百分制、精确到小数点后4位)'][score_index], data['学业成绩考核排名'][score_index]) score_index = 0 break else: pass ''' 说明:存储到csv文件中时,必须是数据框类型的数据才有to_csv的函数!且columns对应的数据必须是一个列表 ''' last_class = list() last_pe = list() last_gpa = list() last_rank = list() last_score = list() last_gpa_rank = list() for name in stu_class['姓名']: # 要追加而不是覆盖 try: last_class.append(dic[name][0]) last_pe.append(dic[name][1]) last_gpa.append(dic[name][2]) last_rank.append(dic[name][3]) last_score.append(dic[name][4]) last_gpa_rank.append(dic[name][5]) except KeyError: # 部分名字没有对应的数据,那么try、except后,无数据的名字就会跳过了 pass last = pd.DataFrame() last['姓名'] = list(dic.keys()) last['班级'] = last_class last['体测'] = last_pe last['绩点'] = last_gpa last['绩点排名'] = last_gpa_rank last['综测得分'] = last_score last['综测排名'] = last_rank result = pd.DataFrame(last, columns=['姓名', '班级', '体测', '绩点', '绩点排名', '综测得分', '综测排名']) result.to_csv('最终文件.csv', index=False, encoding='gbk')
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。