爬虫系列9CSV模块

本文深入探讨了Python中的CSV模块,讲解如何高效地读写CSV文件,包括使用csv.reader、csv.writer进行数据操作,以及在爬虫项目中处理和存储数据的关键技巧。
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() 编写文件名字
### 如何将爬虫抓取的数据保存为CSV格式 为了实现这一目标,可以按照以下方法操作: #### 数据准备与处理 在使用 Python 编写爬虫程序时,通常会先利用 `requests` 或 `BeautifulSoup` 等库来获取网页内容并解析所需数据。这些数据可能以列表或字典的形式存在,在将其保存至 CSV 文件之前,需确保其结构化以便于存储[^1]。 #### 使用 Pandas 库保存数据到 CSV 文件 Pandas 是一种强大的数据分析工具包,它提供了简单的方法来创建 DataFrame 并导出为 CSV 文件。下面是一个完整的例子展示如何完成此过程: ```python import pandas as pd # 假设我们已经从网站上提取了一些书籍的信息 book_data = [ {"title": "Book A", "author": "Author X", "price": "$20"}, {"title": "Book B", "author": "Author Y", "price": "$25"} ] # 将数据转化为DataFrame对象 df_books = pd.DataFrame(book_data) # 保存到本地路径下的CSV文件中,设置参数 index=False 表示不保留索引列;encoding='utf-8-sig' 解决中文乱码问题 df_books.to_csv('books.csv', index=False, encoding='utf-8-sig') ``` 上述代码片段展示了如何构建一个简单的 DataFrame 来表示图书信息,并通过调用 `.to_csv()` 方法将其保存成名为 'books.csv' 的文件[^3]。 #### 手动逐行写入 CSV 文件 如果不想依赖第三方库如 Pandas,则可以直接使用内置模块 csv 进行手动写入。这种方式更加基础但也同样有效: ```python import csv data_rows = [["Title", "Author", "Price"], ["Book C", "Author Z", "$30"]] with open('output.csv', mode='w', newline='', encoding='utf-8-sig') as file: writer = csv.writer(file) for row in data_rows: writer.writerow(row) ``` 这里定义了一个二维数组 `data_rows`, 它包含了表头和一条记录。接着打开一个新的 CSV 文件 (命名为 output.csv),并通过循环遍历每一行数据写出到该文件里去[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

豆豆orz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值