爬虫系列9CSV模块

本文深入探讨了Python中的CSV模块,讲解如何高效地读写CSV文件,包括使用csv.reader、csv.writer进行数据操作,以及在爬虫项目中处理和存储数据的关键技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

csv文件格式是一种通用的电子表格和数据库导入导出格式。
1、文件读写
    首先打开一个文件,以二进制形式打开
    用csv.reader(file)读取文件,返回列表
    for row in reader:
        row[0] row[1]
    用csv.writer(file)写入文件
    writer.writerows(someiterable)


# 读取csv文件
import csv
with open('some.csv', 'rb') as f: # 采用b的方式处理可以省去很多问题
    reader = csv.reader(f)
    for row in reader:
        # do something with row, such as row[0],row[1]


import csv
with open('some.csv', 'wb') as f: # 采用b的方式处理可以省去很多问题
    writer = csv.writer(f)
    writer.writerows(someiterable)


默认的情况下, 读和写使用逗号做分隔符(delimiter),用双引号作为引用符(quotechar),当遇到特殊情况是,可以根据需要手动指定字符。
import csv
with open('passwd', 'rb') as f:
    reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
    for row in reader:
        print row
上述示例指定冒号作为分隔符,并且指定quote方式为不引用。这意味着读的时候都认为内容是不被默认引用符(")包围的。quoting的可选项为: QUOTE_ALL,
QUOTE_MINIMAL, QUOTE_NONNUMERIC, QUOTE_NONE.
有点需要注意的是,当用writer写数据时, None 会被写成空字符串,浮点类型会被调用 repr() 方法转化成字符串。所以非字符串类型的数据会被 str() 成字符串存
储。所以当涉及到unicode字符串时,可以自己手动编码后存储或者使用csv提供的 UnicodeWriter,

字典方式读写:

CS模块提供的字典读写模块格式如下:
class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)

其中fieldnames指定字典的key值,如果reader里没有指定那么默认为第一行的元素,在writer里一定要指定这个

使用实例:
# 读
>>> import csv
>>> with open('names.csv') as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])
...
Baked Beans
Lovely Spam
Wonderful Spam


# 写
import csv
with open('names.csv', 'w') 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'})

字符编码问题
import csv


def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
    # csv.py doesn't do Unicode; encode temporarily as UTF-8:
    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
        dialect=dialect, **kwargs)
    for row in csv_reader:
        # decode UTF-8 back to Unicode, cell by cell:
        yield [unicode(cell, 'utf-8') for cell in row]
        def utf_8_encoder(unicode_csv_data):
        for line in unicode_csv_data:
            yield line.encode('utf-8')

格式参数:
    delimiter ,
    doublequote
    escapechar
    lineterminator \r\n
    quotechar ""
    quoting QUOTE_MINIMAL
    skipinitialspace
    strict

常用方法:
    读方法:
    csvreader.next() 读取下一行
    csvreader.dialect A read-only description of the dialect in use by the parser.
    csvreader.line_num 从迭代器中读取行号,一个资源可能占据多行,所以不等于表格行号
    写方法:
        csvwriter.writerow(row)
        csvwriter.writerows(rows)
        csvwriter.dialect
        DictWriter.writeheader() 编写文件名字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆豆orz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值