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文件的读写,这在某些情况下会遇到一些错误