likes
comments
collection
share

Python标准库-CSV 文件操作

作者站长头像
站长
· 阅读数 20

Python 的标准函数"csv"提供了操作 CSV 文件的方法,可以针对 CSV 文件进行读取、写入或修改,这篇文章将介绍 csv 常用的方法。

CSV 是什么

CSV 是一种以"逗号分隔值"的文件格式,并以"纯文本形式"存储数据(数字和文字),CSV 是一种通用并相对简单的文件格式,广泛应用于用户、商业和科学领域,因此几乎所有的分析软件和应用程序,都支持 CSV 格式。

下方所呈现的是一个简单的 CSV 文件内容,第一行可以作为普通的内容,也可以是表格的表头:

name,id,color,price
apple,1,red,10
orange,2,orange,15
grap,3,purple,20
watermelon,4,green,30

CSV 常用方法

下方列出几种 csv 模块常用的方法:

方法參數說明
reader()csvfile读取 CSV 文件(序列形式)。
writer()csvfile写入 CSV 文件(序列形式)。
DictReader()csvfile读取 CSV 文件(字典形式)。
DictWriter()csvfile, fieldnames写入 CSV 文件(字典形式)。

import csv

要使用 csv 必须先 import csv 模块,或使用 from 的方式,单独 import 特定模块。

import csv
from csv import reader

reader(csvfile)

csv.reader(csvfile) 可以用"序列"的类型,读取 CSV 文件,读取后可以使用序列的操作方式,将每一行(row)打印出来,此外,还可以设定 delimiter 参数,针对"变种 CSV 格式做设置"

import csv
csvfile = open('csv-demo.csv')
r = csv.reader(csvfile)     # 读取csv文件
for row in list(r):         # 将读取的文件,转换成序列的方式,打印出每个项目
    print(row)

['name''id''color''price']
['apple''1''red''10']
['orange''2''orange''15']
['grape''3''purple''20']
['watermelon''4''green''30']

writer(csvfile)

csv.writer(csvfile) 可以用"序列"的类型,将数据写入 CSV 文件,写入的方法分为 writerow 单行写入以及 writerows 多行写入两种,下方的例子使用 writerow 写入单行数据。

注意,open 模式使用 a+表示可以读取文件以及写入数据在原本数据的最后方,因此如果 CSV 最后一行不为空,数据会加在最后一行数据后方(在同一行),为了避免这个问题,可以将 CSV 文件增加最后一行,或使用 writerow('')加入一个空行。

import csv
csvfile = open('csv-demo.csv''a+')    # 使用a+模式打开文件
r = csv.writer(csvfile)                 # 设置r为写入
r.writerow('')                          # 如果原本的CSV最后一行row不为空,加入换行
                                        # 如果最后一行为空则不用
r.writerow(['banana',5,'yellow',20])    # 写入单行数据

Python标准库-CSV 文件操作

下方的例子使用 writerows 写入多行数据。

import csv
csvfile = open('csv-demo.csv''a+')
write = csv.writer(csvfile)
data = [                        # 建立要写入的数据序列
    ['banana',5,'yellow',20],
    ['papaya',6,'orange',30]
]
write.writerows(data)           # 写入多行数据

Python标准库-CSV 文件操作

DictReader(csvfile)

csv.DictReader(csvfile) 可以用"字典"的类型,读取 CSV 文件,读取后可以使用字典的操作方式,将每一行(row)打印出来,除了 csvfile 为必须填入的参数,还有下列几个非默认的参数(不填入则使用默认值)。

参数说明
fieldnames默认 None,会使用 CSV 的第一行作为字典的键,如果有设置则会以 fieldnames 的内容作为键。
restkey默认 None,如果有设置,某行多出来的数据会以 restkey 设置值作为键。
restval默认 None,如果有设置,某行缺少的数据会以 restval 作为值。

下方的代码执行后,会读取 CSV 并单独打印出 name、id、color 和 price。

import csv
csvfile = open('csv-demo.csv''r')   # 打开CSV文件模式为r
data = csv.DictReader(csvfile)        # 以字典方式读取数据
for i in data:
    print(i['name'],i['id'],i['color'],i['price'])   # 分别打印出不同键的值

# apple 1 red 10
# orange 2 orange 15
# grape 3 purple 20
# watermelon 4 green 30
# banana 5 yellow 20

如果 CSV 的第一行不是標題 ( 直接就是資料 ),可透過下方的程式碼,使用 fieldnames 加入鍵 ( 為了明顯區隔,範例裡使用 a、b、c、d ),輸出結果可以看到,字典裡所有資料的鍵,都變成 a、b、c、d。

import csv
csvfile = open('csv-demo.csv', 'r')
keys = ['a','b','c','d']       # 手动设置字典的键
data = csv.DictReader(csvfile, fieldnames=keys)   # 设置fieldnames为keys
for i in data:
    print(i)
OrderedDict([('a''name'), ('b''id'), ('c''color'), ('d''price')])
OrderedDict([('a''apple'), ('b''1'), ('c''red'), ('d''10')])
OrderedDict([('a''orange'), ('b''2'), ('c''orange'), ('d''15')])
OrderedDict([('a''grap'), ('b''3'), ('c''purple'), ('d''20')])
OrderedDict([('a''watermelon'), ('b''4'), ('c''green'), ('d''30')])
OrderedDict([('a''banana'), ('b''5'), ('c''yellow'), ('d''20')])

如果 CSV 的数据有多出来,或有缺漏,可通过下方的代码,使用 restkey 或 restval 来补齐(图片是有多出来以及有缺漏的 CSV 文件),执行后可以看到第四笔数据多了一个 more 的键,最后一行数据缺漏的值都变成 0。

import csv
csvfile = open('csv-demo.csv', 'r')
data = csv.DictReader(csvfile, restkey='more', restval='0')
for i in data:
    print(i)
OrderedDict([('name''apple'), ('id''1'), ('color''red'), ('price''10')])
OrderedDict([('name''orange'), ('id''2'), ('color''orange'), ('price''15')])
OrderedDict([('name''grap'), ('id''3'), ('color''purple'), ('price''20')])
OrderedDict([('name''watermelon'), ('id''4'), ('color''green'), ('price''30'), ('more', ['1234567'])])
OrderedDict([('name''test'), ('id''0'), ('color''0'), ('price''0')])

Python标准库-CSV 文件操作

DictWriter(csvfile, fieldnames)

DictWriter(csvfile, fieldnames) 可以用"字典"的类型,将数据写入 CSV 文件,写入的方法分为 writerow 单行写入以及 writerows 多行写入两种,下方的例子使用 writerow 写入单条数据。

注意,open 模式使用 a+表示可以读取文件以及写入数据在原本数据的最后方,因此如果 CSV 最后一行不为空,数据会加在最后一行数据后方(在同一行),为了避免这个问题,可以将 CSV 文件增加最后一行,或使用 writerow('')加入一个空行。

import csv
fieldnames = ['name','id','color','price']    # 定义要写入数据的键
data = csv.DictWriter(csvfile, fieldnames=fieldnames)  # 设置data为写入数据
data.writerow({'name':'papaya','id':5,'color':'orange','price':30})  # 写入数据

Python标准库-CSV 文件操作

下方例子使用 writerows 写入多条数据,多条数据使用“列表 + 字典”的形式表现

import os
import csv
os.chdir('/content/drive/MyDrive/Colab Notebooks')
fieldnames = ['name','id','color','price']    # 定義要寫入資料的鍵
data = csv.DictWriter(csvfile, fieldnames=fieldnames)  # 設定 data 為寫入資料
w = [
    {'name':'papaya','id':5,'color':'orange','price':30},
    {'name':'banana','id':6,'color':'yellow','price':20}
]
data.writerows(w)

Python标准库-CSV 文件操作

转载自:https://juejin.cn/post/7395471738564706339
评论
请登录