# Python CSV 教程-读写 CSV

> 原文： [http://zetcode.com/python/csv/](http://zetcode.com/python/csv/)

Python CSV 教程显示了如何使用 Python csv 模块读取和写入 CSV 数据。

## CSV

CSV（逗号分隔值）是在电子表格和数据库中使用的非常流行的导入和导出数据格式。 CSV 文件中的每一行都是一个数据记录。 每个记录由一个或多个字段组成，用逗号分隔。 CSV 是一种非常简单的数据格式，但是可以有很多差异，例如不同的定界符，换行或引号字符。

## Python CSV 模块

`csv`模块实现用于以 CSV 格式读取和写入表格数据的类。 `csv`模块的`reader`和`writer`对象读取和写入序列。 程序员还可以使用`DictReader`和`DictWriter`类以字典形式读取和写入数据。

## Python CSV 方法

下表显示了 Python csv 方法：

| 方法 | 描述 |
| --- | --- |
| `csv.reader` | 返回一个遍历 CSV 文件各行的读取器对象 |
| `csv.writer` | 返回将数据写入 CSV 文件的写入器对象 |
| `csv.register_dialect` | 注册 CSV 方言 |
| `csv.unregister_dialect` | 注销 CSV 方言 |
| `csv.get_dialect` | 返回具有给定名称的方言 |
| `csv.list_dialects` | 返回所有已注册的方言 |
| `csv.field_size_limit` | 返回解析器允许的当前最大字段大小 |

## 使用 Python `csv`模块

```py
import csv

```

要使用 Python CSV 模块，我们导入`csv`。

## Python CSV 读取器

`csv.reader()`方法返回一个读取器对象，该对象遍历给定 CSV 文件中的行。

```py
$ cat numbers.csv 
16,6,4,12,81,6,71,6

```

`numbers.csv`文件包含数字。

`read_csv.py`

```py
#!/usr/bin/python3

import csv

f = open('numbers.csv', 'r')

with f:

    reader = csv.reader(f)

    for row in reader:
        for e in row:
            print(e)

```

在代码示例中，我们打开`numbers.csv`进行读取并读取其内容。

```py
reader = csv.reader(f)

```

我们得到`reader`对象。

```py
for row in reader:
    for e in row:
        print(e)

```

通过两个`for`循环，我们遍历数据。

```py
$ ./read_csv.py 
16
6
4
12
81
6
71
6

```

这是示例的输出。

## 具有不同分隔符的 Python CSV 读取器

`csv.reader()`方法允许使用带有`delimiter`属性的不同定界符。

```py
$ cat items.csv 
pen|cup|bottle
chair|book|tablet

```

`items.csv`包含用“`|`”分隔的字符值。

`read_csv.py`

```py
#!/usr/bin/python3

import csv

f = open('items.csv', 'r')

with f:

    reader = csv.reader(f, delimiter="|")

    for row in reader:

        for e in row:            
            print(e)

```

该代码示例从使用`'|'`定界符的 CSV 文件读取并显示数据。

```py
$ ./read_csv2.py 
pen
cup
bottle
chair
book
tablet

```

这是示例的输出。

## Python CSV `DictReader`

`csv.DictReader`类的操作类似于常规读取器，但会将读取的信息映射到字典中。 字典的键可以使用`fieldnames`参数传入，也可以从 CSV 文件的第一行推断出来。

```py
$ cat values.csv 
min,avg,max
1, 5.5, 10
2, 3.5, 5

```

文件的第一行包含字典键。

`read_csv_dictionary.py`

```py
#!/usr/bin/python3

# read_csv3.py

import csv

f = open('values.csv', 'r')

with f:

    reader = csv.DictReader(f)

    for row in reader:
        print(row['min'], row['avg'], row['max'])

```

该示例使用`csv.DictReader`从`values.csv`文件中读取值。

```py
for row in reader:
    print(row['min'], row['avg'], row['max'] )

```

该行是 Python 字典，我们使用键引用数据。

## Python CSV 编写器

`csv.writer()`方法返回一个`writer`对象，该对象将用户数据转换为给定文件状对象上的定界字符串。

`write_csv.py`

```py
#!/usr/bin/python3

import csv

nms = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]

f = open('numbers2.csv', 'w')

with f:

    writer = csv.writer(f)

    for row in nms:
        writer.writerow(row)

```

该脚本将数字写入`numbers2.csv`文件。 `writerow()`方法将一行数据写入指定的文件。

```py
$ cat numbers2.csv 
1,2,3,4,5,6
7,8,9,10,11,12

```

一次写入所有数据是可能的。 `writerows()`方法将所有给定的行写入 CSV 文件。

`write_csv2.py`

```py
#!/usr/bin/python3

import csv

nms = [[1, 2, 3], [7, 8, 9], [10, 11, 12]]

f = open('numbers3.csv', 'w')

with f:

    writer = csv.writer(f)
    writer.writerows(nms)

```

该代码示例使用`writerows()`方法将三行数字写入文件。

## Python CSV `DictWriter`

`csv.DictWriter`类的操作类似于常规编写器，但将 Python 字典映射到 CSV 行。 `fieldnames`参数是一系列键，这些键标识传递给`writerow()`方法的字典中的值写入 CSV 文件的顺序。

`write_csv_dictionary.py`

```py
#!/usr/bin/python3

import csv

f = open('names.csv', 'w')

with f:

    fnames = ['first_name', 'last_name']
    writer = csv.DictWriter(f, fieldnames=fnames)    

    writer.writeheader()
    writer.writerow({'first_name' : 'John', 'last_name': 'Smith'})
    writer.writerow({'first_name' : 'Robert', 'last_name': 'Brown'})
    writer.writerow({'first_name' : 'Julia', 'last_name': 'Griffin'})

```

该示例使用`csv.DictWriter`将 Python 字典中的值写入 CSV 文件。

```py
writer = csv.DictWriter(f, fieldnames=fnames) 

```

创建了新的`csv.DictWriter`。 标头名称将传递给`fieldnames`参数。

```py
writer.writeheader()

```

`writeheader()`方法将标头写入 CSV 文件。

```py
writer.writerow({'first_name' : 'John', 'last_name': 'Smith'})

```

Python 字典被写入 CSV 文件中的一行。

```py
$ cat names.csv 
first_name,last_name
John,Smith
Robert,Brown
Julia,Griffin

```

这是输出。

## Python CSV 自定义方言

使用`csv.register_dialect()`方法创建自定义方言。

`custom_dialect.py`

```py
#!/usr/bin/python3

import csv

csv.register_dialect("hashes", delimiter="#")

f = open('items3.csv', 'w')

with f:

    writer = csv.writer(f, dialect="hashes")
    writer.writerow(("pens", 4)) 
    writer.writerow(("plates", 2))
    writer.writerow(("bottles", 4))
    writer.writerow(("cups", 1))

```

该程序使用（# ）字符作为分隔符。 使用`csv.writer()`方法中的`dialect`选项指定方言。

```py
$ cat items3.csv 
pens#4
plates#2
bottles#4
cups#1

```

这是输出。

在本教程中，我们使用 Python 处理 CSV。

您可能也会对以下相关教程感兴趣： [Python 教程](/lang/python/)， [Python 列表推导式](/articles/pythonlistcomprehensions/)， [PrettyTable 教程](/python/prettytable/)， [PyMongo 教程](/python/pymongo/)， [Python SimpleJson 教程](/python/simplejson/)， [OpenPyXL 教程](/articles/openpyxl/)， [Python Requests 教程](/web/pythonrequests/)和 [Python 列表推导](/articles/pythonlistcomprehensions/)。