目录
  • 1、将字典存入csv文件
  • 2、列表按列存入csv文件
  • 3、反例(没转字典就只有一列)
  • 实战需求
    • 需求1
    • 需求2
  • 总结

    主要用了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')

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持小闻网。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。