一看就会的通过python操作读写csv文件的方法

csv文件

csv介绍

csv的文件格式是一种常见的电子表格的文件格式,通常使用逗号进行分隔。当然,虽然说通常都是逗号分隔,但是也可以不使用逗号,不过呢,不使用逗号的文件分隔形式可能会起别的名字,例如dsv或者tsv,可能不会使用csv的名字,不过这些文件有的时候也统称为csv文件

对于不了解csv的人,想要快速明白什么是csv,有一个简单的比喻,csv就像excel一样,打开以后通常是一个表格的形式。这个比喻呢仅仅只是一个比喻,并不是特别恰当,因为excel和csv还是不一样的,excel有很多的复杂的,高级的功能,并不仅仅只是csv那么简单,但是可以确定的是,csv的格式可以轻松导入excel中

那么,csv的格式到底是什么样子呢?其实就是数据之间使用了逗号进行了分隔,例如说吴茗,18,2381634273,这样的形式可能就是csv中的一条数据。这里只需要注意一个平时可能不确定的点,在每行数据的结尾,是不需要添加逗号的 

总而言之呢,csv是非常重要的,不过今天不是为了阐述csv的重要性,所以,下面我们就简单的来探讨一下,python中如何读写csv文件

csv文件模拟

以下是一份模拟的学生记录,用于描述csv文件到底是什么样子的,我们会假定它保存在了当前目录的students.csv文件中

学生姓名,年龄,性别,班级,成绩
张三,18,男,1年1班,85
李四,17,女,1年2班,92
王五,18,男,1年1班,78
小孙,16,女,1年3班,88
小刘,17,男,1年2班,90
小陈,19,男,2年1班,87
陈二,16,女,2年2班,93
陈小二,18,男,2年1班,82
陈大二,17,女,2年3班,89

读写csv

自行读写csv

虽然这不是一个推荐的做法,但是自己通过python的文件读写和循环功能,是可以实现大多数情况下对于csv文件的读写的,只需要满足csv的格式就行了

# 这是一个自制的读取csv文件的代码
def csv_reader(file_path, delimiter=","):
    content_list = []
    with open(file_path, "r") as f:
        while csv_row := f.readline():
            content_list.append(csv_row.rstrip().split(delimiter))
    return content_list

# 这是一个自制的写入csv文件的代码
def csv_writer(file_path, content_list, delimiter=","):
    with open(file_path, "w", newline="") as f:
        for row in content_list:
            f.write(delimiter.join(row) + "\n")
    return None

那么,看起来自己读写csv,也只需要简单几行代码就可以了,应该不需要其他方式了。但是我们仔细思考一下,这两段代码真的正确吗?事实上,在大多数情况下,确实没什么问题,它们可以满足csv文件的读写,但是在一些特殊情况下,这个功能实现是错误的

比如说,如果我们以逗号作为分隔符,但是,恰好在我们的数据中还有逗号,比如说黑神话,悟空,那么存入的时候,这是一个整体,但是下次再读取的时候,就莫名其妙的被拆分成两个字段了,那么这样一行的数据就会多出来,显然遇到严重错误了

但是显而易见的,如果我们自己修改这两个函数,使其能够支持特殊情况下的csv文件读写,还挺麻烦的,因此,不推荐使用这种简单的函数,而是应该使用更好的方法

使用标准库csv读写csv文件

事实上,在python中已经内置了csv库,我们可以使用内置的csv库完成csv的读写

读csv文件,我们应当这样做

import csv

with open("students.csv") as csvfile:
    csv_reader = csv.reader(csvfile, delimiter=",")
    for row in csv_reader:
        print(row)

写入csv文件,我们应当这样做

import csv

with open("students2.csv", "w", newline="") as csvfile:
    csv_writer = csv.writer(csvfile, delimiter=",")
    csv_writer.writerow(["name", "age", "qq"])
    csv_writer.writerow(["wuming", "18", "2381634273"])

唯一需要注意的是,在写文件的时候,使用了newline=""的形式,这样做的好处是,可以避免不同操作系统对于文件写入的影响

使用pandas读写csv文件

python的内置库,已经可以很好的完成csv的读写了,但是如果使用pandas读写csv的话,可能更方便,况且很多人读取csv就是为了给pandas使用的,那么,为什么不直接通过pandas来进行读写呢?

通过pandas读取csv,这只需要一行代码就可以完成了,比起前两种都方便了许多啊

import pandas as pd

csv_data = pd.read_csv("students.csv")
print(csv_data)

通过pandas写入csv,注意的是,如果刚刚读了数据,就重新写回去的话,一定要设置index=False,不然把pandas提供的索引写入进去了,就不对了,和原文件不一样了

import pandas as pd

# csv_data应该是一个DataFrame类型,就比如说,刚刚读取的csv_data
csv_data.to_csv("students2.csv", index=False)

那么,如果我希望写入的是python的二维列表的形式,怎么办呢?也很简单,不过如果是通过列表直接转为dataframe的,在写入csv的时候,需要同时设置两处的不写入索引

import pandas as pd

csv_list = [
    ["name", "age", "qq"],
    ["wuming", "18", "2381634273"]
]

csv_data = pd.DataFrame(csv_list)
csv_data.to_csv("students2.csv", index=False, header=False)

以上的代码,虽然如果仅仅是为了读写csv,是没什么问题的,但是如果作为dataframe的使用,这不太对,因为第一行数据应该作为标题出现,而不是放入数据部分,因此应该进行一些修改

import pandas as pd

csv_list = [
    ["name", "age", "gender"],
    ["小吴", "18", "male"]
]

csv_data = pd.DataFrame(csv_list[1::], columns=csv_list[0])
csv_data.to_csv("students.csv", index=False)

结果是一样的,但是如果要给pandas使用的话,在使用的过程中,这样做是有必要的

总结

从这里我们可以看出,通过python读写csv文件,是一件非常容易的事情

当然,同样也存在一些其他的方式来读写csv,不过一般情况下,使用内置的csv库和使用pandas这两种方式就够了,因此在这里就不额外加入更多的读写方式了。具体使用的时候,根据需求选择即可,但是尽量不要自己通过文件读写以及循环的方式,来完成csv文件的读写,这在某些情况下会遇到一些错误

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值