一、项目背景
海盐商贸学校刚进行了Python测验,成绩记录在一张csv表中,但是有的同学发挥失利,成绩不太理想,如果进行公布,势必会伤及自尊。因此,需要把这张csv表进行拆分,每位同学一张表,每张表只有一位同学的成绩。
二、CSV文件读取
1.with open() as 变量名
with open() as 变量名
是open()
函数的优化,这种方法最大的不同就是不需要使用 close()
函数关闭文件,因为我们总是会忘记关闭文件,导致占用大量系统资源,推荐使用这种方法。
2.读取为列表
render()
函数是csv模块内的一个函数,用于读取csv文件对象,得到一个可迭代对象,该对象里面的每一个元素都是一个列表,每一个列表都对应了csv文件中的一行。
import csv
# newline=''可避免空行
with open('./Python期末成绩.csv', 'r', encoding='utf-8-sig', newline='') as csv_file:
# 读取文件对象,得到reader对象,reader对象是一个可迭代的列表
csv_reader = csv.reader(csv_file)
for csv_row in csv_reader:
print(csv_row)
3.读取为字典
和render()
函数不同的是,DictReader()
实例化之后得到一个字典,字典的键就是表头,这个表头可以通过fieldnames属性得到。
import csv
# newline=''可避免空行
with open('./Python期末成绩.csv', 'r', encoding='utf-8-sig', newline='') as csv_file:
# 读取文件对象,得到DictReader对象,DictReader对象是一个可迭代的字典,字典的键就是表头
csv_reader = csv.DictReader(csv_file)
# 可通过fieldnames属性获取表头
headers = csv_reader.fieldnames
print(f'表头:{headers}')
for csv_row in csv_reader:
print(csv_row)
三、CSV文件写入
1.写入列表数据
写入文件需要先把文件对象转换为writer对象,然后调用writer对象的writerow()
方法将数据写入文件,不过要注意数据必须是一个可迭代的对象,推荐使用列表。
import csv
student_list = [
['小虎','55'],
['小老虎', '75'],
]
# 打开'./平时成绩.csv'文件,获取文件对象,如果没有会自动创建
with open('./平时成绩.csv', 'w', encoding='utf-8', newline='') as csv_file:
# 将文件对象转换为writer对象
csv_writer = csv.writer(csv_file)
# 将列表中的元素写入csv文件中
for student in student_list:
csv_writer.writerow(student)
# 还有一种方法是writerows(),自己对比区别吧
# csv_writer.writerows(student_list)
2.写入字典数据
如果要写入字典类型的数据,需要先将文件对象转换为DictWriter对象。
不过需要设置字典的键,也就是表头。
设置方法就是在实例化DictWriter对象时传入参数fieldnames
,再调用writeheader()
方法。
import csv
student_list = [{'姓名':'小虎','成绩':'65'},{'姓名':'小老虎','成绩':'85'}]
# 设置表头
headers = ['姓名', '成绩']
# 打开'./平时成绩.csv'文件,获取文件对象,如果没有会自动创建
with open('./平时成绩.csv', 'w', encoding='utf-8', newline='') as csv_file:
# 将文件对象转换为DictWriter对象
csv_writer = csv.DictWriter(csv_file, fieldnames=headers)
# 写入表头
csv_writer.writeheader()
# 将列表中的元素写入csv文件中
for student in student_list:
csv_writer.writerow(student)
# 还有一种方法是writerows(),自己对比区别吧
# csv_writer.writerows(student_list)
四、完成项目
1.用列表类型完成
from asyncore import write
import csv
result_path = './拆分结果/'
# newline=''可避免空行
with open('./Python期末成绩.csv', 'r', encoding='utf-8-sig', newline='') as csv_file:
csv_reader = csv.reader(csv_file)
for csv_row in csv_reader:
save_path =result_path + csv_row[0] + '.csv'
print(save_path)
# 打开'./平时成绩.csv'文件,获取文件对象,如果没有会自动创建(注意文件夹不会自动创建)
with open(save_path, 'w', encoding='utf-8', newline='') as save_file:
# 将文件对象转换为DictWriter对象
save_file_writer = csv.writer(save_file)
# 将列表中的元素写入csv文件中
save_file_writer.writerow(csv_row)
2.用字典类型完成(推荐)
import csv
result_path = './拆分结果/'
# newline=''可避免空行
with open('./Python期末成绩.csv', 'r', encoding='utf-8-sig', newline='') as csv_file:
# 读取文件对象,得到DictReader对象,DictReader对象是一个可迭代的字典,字典的键就是表头
csv_reader = csv.DictReader(csv_file)
# 可通过fieldnames属性获取表头
headers = csv_reader.fieldnames
print(f'表头:{headers}')
for csv_row in csv_reader:
save_path =result_path + csv_row['姓名'] + '.csv'
print(save_path)
# 打开'./平时成绩.csv'文件,获取文件对象,如果没有会自动创建(注意文件夹不会自动创建)
with open(save_path, 'w', encoding='utf-8', newline='') as save_file:
# 将文件对象转换为DictWriter对象
save_file_writer = csv.DictWriter(save_file, fieldnames=headers)
# 写入表头
save_file_writer.writeheader()
# 将列表中的元素写入csv文件中
save_file_writer.writerow(csv_row)
项目完成🐱🚀😎