csv文件处理

今天先简单的使用一些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'})

官方文档点这里

你可能感兴趣的:(Python)