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()可以写入多行数数据(序列包含多个字典表)