一,什么是CSV文件
CSV(Comma-Separated Values,CSV)是逗号分隔符的简称,以纯文本形式存储表格数据(可以把纯文本理解为字符串)。
CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符最常见的是逗号或制表符。
CSV文件格式的通用标准并不存在,但是在RFC 4180中有基础性的描述。使用的字符编码同样没有被指定,但是7-bit ASCII是最基本的通用编码。术语“CSV”,泛指具有以下特征的文件:
- 纯文本,使用某个字符集,比如ASCII,Unicode,EBCDIC或GB2312
- 由记录组成,典型的是每行一条记录
- 每条记录被分隔符分隔为字段(典型的分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格)
- 每条记录都有同样的字段序列。
CSV文件需遵循以下规则:
- 开头不留空,以行为单位
- 可包含或不含列名,含列名则局文件第一行
- 一行数据不跨行,不空行
- 以半角逗号作为分隔符,列为空也要表达其存在
- 列内容如存在半角引号,替换成半角双引号转义
- 文件读写时引号、逗号操作规则互逆
- 内码格式不限,可以为ASCII、Unicode或者其他
- 不支持数字
- 不支持特殊字符
CSV文件举例:
AKDT,Max TemperatureF,Mean TemperatureF,Min TemperatureF
2014-7-1,64,56,50
二,CSV文件用在哪里?
CSV是一种通用的、相对简单的文件格式,被用户、商业或者科学广泛应用。最广泛的应用是在程序之间转移表格数据,而这些程序之间本身是不兼容的。例如,一个用户可能需要交换信息,以一个私有格式存储数据的数据库程序,到一个数据格式完全不同的电子表格。最可能的情况是,该数据程序可以到处数据为CSV,然后被到处的CSV文件可以被电子表格程序导入。
大量的数据网站都提供了CSV文件格式的下载,比如:Kaggle:https://www.kaggle.com/datasets。
另外,由于CSV只存在常规约束,而不是明确定义的格式,因此CSV文件存在许多变体。故CSV文件并不完全互通。然而,这些变异非常小,并且有许多应用程序允许用户预览文件,然后制定分隔符、转移规则等,因此在实践中,CSV文件还是非常方便 的。
三,Python读写CSV文件
Python对CSV文件的操作,需要借助CSV模块,因此在对CSV文件操作前,需要先import CSV。CSV中提供了Reader(),和DictReader()两个方法来读取CSV文件,同时也提供过了Writer()和DictWriter()两个方法来写入CSV文件。
1.Reader读取CSV文件:
with open(filename,'r') as file:
reader=csv.reader(file)
for row in reader:
print(reader.line_num,row)
2.DictReader读取CSV文件(提供类似Python中字典的操作,通过列名,读取列中的数据):
with open(filename,'r') as f:
reader=csv.DictReader(f)
for row in reader:
max_temp=row['Max TemperatureF']
print(max_temp)
3.Writer写CSV文件:
#CSV写文件操作
datas = [['name', 'age'],
['Bob', 14],
['Tom', 23],
['Jerry', '18']]
with open(writefile,'w',newline='') as file1:
writer=csv.writer(file1)
for row in datas:
writer.writerow(row)
#或者用writerrows(),更方便
with open(writefile2, 'w') as file2:
writer = csv.writer(file2)
writer.writerows(datas)
4.DictWriter写CSV对象:
headers = ['name', 'age']
datas2 = [{'name': 'Bob', 'age': 23},
{'name': 'Jerry', 'age': 44},
{'name': 'Tom', 'age': 15}
]
with open('example.csv', 'w', newline='') as f:
# 标头在这里传入,作为第一行数据
writer = csv.DictWriter(f, headers)
writer.writeheader()
for row in datas2:
writer.writerow(row)
# 还可以写入多行
# writer.writerows(datas2)