数据存储:CSV文件读取和存储

import csv

读取CSV文件

1、csv.reader() 返回列表 通过下标方式获详细内容

def read_csv_demo1():
    with open(r'C:\Users\Administrator\Desktop\classroom1.csv') as f:
        reader = csv.reader(f)   # 构造读取器
        # 把文件指针传给csv.reader()方法并赋值给reader,返回迭代器
        # print(reader)
        # next(reader)            # 因为是迭代器所以这样可以把第一行标题去掉
        headers = next(reader)  # 把第一行数据(表头)读出来,返回一个列表
        print('单独next出来的表头', headers)
        for i in reader:     # 遍历这个迭代器
            print(i)     # 每一行数据是一个列表,表头这一行已经被上面的next去掉了
            # print(f'姓名:{i[0]}\t年龄:{i[1]}\t身高:{i[-1]}')
            name = i[0]
            age = i[1]
            height = i[-1]
            print({'name': name, 'age': age, 'height': height})

读取csv并用namedtuple映射列名

from collections import namedtuple
def csv_read_by_namedtuple():
    """读取csv并用namedtuple映射列名"""
    with open(r'C:\Users\Administrator\Desktop\classroom1.csv') as f:
        reader = csv.reader(f)  # 构造读取器,返回迭代器
        # print(reader)
        headers = next(reader)  # 把第一行数据(表头)读出来,返回一个列表
        print('单独next出来的表头', headers)
        Row = namedtuple('Row', headers)
        # 定义一个namedtuple对象,传入读取到的表头headers(列表)
        for r in reader:    # 遍历这个迭代器
            row = Row(*r)   # 实例化并以解包的方式传参
            # 解包相当于把每个列表以关键字的方式对应传入到对象里了
            print(row)
            print(f'{row.username}=>{row.age}=>{row.height}')

2、csv.DictReader() 通过字典表方式,可以方便查找 不易出错

def read_csv_demo2():
    with open(r'C:\Users\Administrator\Desktop\classroom1.csv') as f:
        # 使用DictReader创建的reader对象,不会包含第一行标题,标题将成为字典表的keys
        # reader返回的是一个迭代器,遍历这个迭代器将返回一个有序的字典表
        reader = csv.DictReader(f)  # 构造读取器,返回迭代器
        # print(reader)
        for i in reader:       # 遍历这个迭代器
            # print(i)         # 每一行数据是一个有序字典表
            a = {'name': i['username'], 'age': i['age'], 'height': i.get('height', '未找到')}
            print(a)
            # print(f'{i["username"]}=>{i.get("age")}=>{i.get("height", "未找到")}')

写入CSV文件

第一种:序列包含序列方式

def write_csv_demo1():
    # 表头
    # headers = ['username', 'age', 'height']
    headers = ('username', 'age', 'height')
    # 内容
    values = [
        ('张三', 18, 180),
        ('李四', 19, 175),
        ('王五', 25, 170),
        ('赵六', 20, 190),
        ('马七', 21, 185),
        ['刘八', 22, 185]
    ]

    with open('classroom1.csv', 'w', newline='') as f:
        writer = csv.writer(f)     # 构造写入器,传入文件指针
        # 把文件指针传给.writer()方法并赋值给writer
        writer.writerow(headers)   # .writerow()可以写入一行数据(一个序列)
        writer.writerows(values)   # .writerows()可以写入多行数数据(序列包含多个序列)
    # newline=''是让它写入文件的时候不要加一个换行符,要不然默认是\n,会多一行空行

打开文件的时候,指定编码为utf-8的时候用表格打开文件就是乱码的
不指定 默认ansi 系统编码是gbk,在pycharm里是乱码的,用表格打开是正常的

第二种:序列包含典表方式

def write_csv_demo2():
    # 表头
    headers = ['username', 'age', 'height']
    # 内容
    value = {'username': '刘二', 'age': 28, 'height': 180}
    values = [
        {'username': '张三', 'age': 18, 'height': 175},
        {'username': '李四', 'age': 19, 'height': 176},
        {'username': '王五', 'age': 20, 'height': 177},
        {'username': '赵六', 'age': 21, 'height': 178},
        {'username': '马七', 'age': 22, 'height': 179},
        dict(username='冯八', age=23, height=180)
    ]
    
    with open('classroom2.csv', 'w', newline='') as f:
        writer = csv.DictWriter(f, headers)    # 构造写入器,传入文件指针和表头数据
        writer.writeheader()       # 写入表头数据的时候,需要调用writeheader()方法
        writer.writerow(value)     # .writerow()可以写入一行数据(一个字典表)
        writer.writerows(values)   # .writerows()可以写入多行数数据(序列包含多个字典表)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值