今天先简单的使用一些csv文件处理的一些常用方法,后面使用到numpy、pandas等模块时再补充。
CSV文件格式的通用标准并不存在,可以参看RFC 4180
逗号分隔值(Comma-Separated Values,CSV,有时也成为了字符分隔,因为分隔字符也可以不是逗号)。
其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
更多详细信息可以参考wikipedia
手动生成csv文件
from pathlib import Path
p = Path() / "test.csv"
csv_body = """\
id,name,age
1,小明,18
2,小红,19
3,小黄,17
"""
p.write_text(csv_body)
写入效果如下:
csv模块实现了以CSV格式读取和写入表格数据的类。
csv模块可以使用reader或者writer对象来读写序列,也可以使用DictReader和DictWriter类以字典的形式来读写数据。
csv.reader(csvfile,dialect=“excel”,**fmtparams)
返回reader对象,是一个行迭代器
默认使用excel方言,参考Dialects and Formatting Parameters.
import csv
with p.open(newline="") as f:
x = csv.reader(f)
for i in x:
print(i)
['id', 'name', 'age']
['1', '小明', '18']
['2', '小红', '19']
['3', '小黄', '17']
从csv文件中读取的每一行都作为字符串列表返回。
writer(csvfile, dialect=‘excel’, **fmtparams)
返回一个writer对象,负责将数据转换为给定的类文件对象上的分隔字符串。
csvfile可以使具有write()方法的任何对象。如果csvfile是类文件对象,应该以newline=""的方式打开文件。
可以给出可选的方言参数,改参数用于定义特定于csv方言的一组参数。
一个简短的用法:
l1 = [[1,1,1,1],
[2,2,2,2],
[3,3,3,3],
[4,4,4,4]]
with p.open("w",newline="") as f:
writer = csv.writer(f)
writer.writerows(l1)
writer.writerow([5]*5)
csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect=‘excel’, *args, **kwds)
import csv
with open(csvfile, newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row)
OrderedDict([('first_name', 'Baked'), ('last_name', 'Beans')])
OrderedDict([('first_name', 'Lovely'), ('last_name', 'Spam')])
OrderedDict([('first_name', 'Wonderful'), ('last_name', 'Spam')])
csv.DictWriter(f, fieldnames, restval=’’, extrasaction=‘raise’, dialect=‘excel’, *args, **kwds)
import csv
with open('names.csv', 'w', newline='') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})