主要用了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\')
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
© 版权声明
THE END
暂无评论内容