Python数据分析2—csv文件读写


一、项目背景

海盐商贸学校刚进行了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)

项目完成🐱‍🚀😎


文章作者: 彭韦浩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彭韦浩 !
  目录