今天先简单的使用一些csv文件处理的一些常用方法,后面使用到numpy、pandas等模块时再补充。
csv文件简介
CSV文件格式的通用标准并不存在,可以参看RFC 4180
逗号分隔值(Comma-Separated Values,CSV,有时也成为了字符分隔,因为分隔字符也可以不是逗号)。
其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
基本规则
- CSV是一种被分隔的数据格式,它有被逗号字符分隔的字段/列和以换行结束的记录/行。
- CSV文件不要求特定的字符编码、字节序或行结束符格式(某些软件不支持所有行结束变体)。
- 一条记录结束于行结束符。然而,行结束符可能被作为数据嵌入到字段中,所以软件必须识别被包裹的行结束符(见下述),以便从可能的多行中正确组装一条完整的记录。
- 所有记录应当有相同数目、相同顺序的字段。
- 字段中的数据被翻译为一系列字符,而不是一系列比特或字节(见RFC 2046,section 4.1)。例如,数值量65535可以被表现为5个ASCII字符“65535”(或其它形式如“0xFFFF”、“000065535.000E+00”等等);但不会被作为单个二进制整数的2字节序列(而非两个字符)来处理。如果不遵循这个“纯文本”的惯例,那么该CSV文件就不能包含足够的信息来正确地翻译它,该CSV文件将不大可能在不同的计算机架构间正确传递,并且将不能与text/csv MIME类型保持一致。
- 相邻字段必须被单个逗号分隔开。然而,“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格式读取和写入表格数据的类。
csv模块可以使用reader或者writer对象来读写序列,也可以使用DictReader和DictWriter类以字典的形式来读写数据。
csv.reader
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文件中读取的每一行都作为字符串列表返回。
csv.writer
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
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
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'})