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\')

结果:

e4cf8ac6c55ea9a531efdd2fa6419dfa

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\')

按列追加运行结果结果:

b8a6b30648b48bce44d908290f0c1eab

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\')

运行结果:

fc2d187758abe4c308106f0fce4bc7a2

(提一嘴,发现这里一上面有个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
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容