Python将字典(列表按列)存入csv文件(附带2个实战实例)

目录

总结

1、将字典存入csv文件

2、列表按列存入csv文件

3、反例(没转字典就只有一列)

实战需求

需求1:将磁力文本存入csv表格中,便于统计下载情况和备注

需求2:将两个分开的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')

### 将Python爬取的数据保存CSV并导入SQL数据库 为了实现这一目标,可以分为两个主要部分来完成此操作。首先是利用Python将获取的数据存储到CSV文件中;其次是读取该CSV文件的内容,并将其插入到指定的SQL Server数据库。 #### 存储数据到CSV文件 当通过网络爬虫收集信息之后,通常会得到一系字典列表形式的结果集。下面展示了一种方法用于把这样的结构化数据写入CSV文档: ```python import csv data_to_save = [ {"name": "Alice", "age": 25, "city": "New York"}, {"name": "Bob", "age": 30, "city": "Los Angeles"} ] with open('output.csv', mode='w', newline='', encoding='utf-8') as file: writer = csv.DictWriter(file, fieldnames=["name", "age", "city"]) writer.writeheader() for row in data_to_save: writer.writerow(row) ``` 这段代码创建了一个名为`output.csv`的新文件,并向其中添加了几条记录作为示范[^1]。 #### 导入CSV中的数据到SQL Server 一旦拥有了准备好的CSV文件,就可以继续执行下一步——连接到SQL Server并将这些数据加载进去。这里给出一段完整的脚本,它不仅展示了如何建立与SQL Server之间的链接,还包含了错误处理机制以及简单的数据清理逻辑: ```python from sqlalchemy import create_engine import pandas as pd # 创建引擎对象以便于后续操作 engine = create_engine(uri_mssql) try: df = pd.read_csv('output.csv') # 清洗数据前先检查是否存在缺失值等问题 df['cleaned_name'] = df['name'].apply(lambda x: str(x).strip() if isinstance(x, (str)) else None) except Exception as e: print(f"Error reading or cleaning CSV data: {e}") else: try: # 使用to_sql函数直接将DataFrame转换成表的形式存入数据库内 df.to_sql(name='your_table_name', con=engine, index=False, if_exists='append') except Exception as e: print(f"Failed to insert into database: {e}") finally: engine.dispose() ``` 上述程序片段首先定义了指向本地SQL Server实例的URI字符串 `uri_mssql = 'mssql+pymssql://usr:pwd@localhost/db'` ,接着尝试打开之前生成的CSV文件并应用一些基本的数据预处理步骤(比如去除多余空格)。成功解析后,则调用Pandas库里的`.to_sql()` 方法一次性地将整个表格上传到了远程服务器上预先设定的目标位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值