Python CSV文件读取、写入总结

前提:Python导入csv 模块

import csv

创建:

利用csv包中的writer函数,如果文件不存在,会自动创建,需要注意的是,文件后缀一定要是.csv,这样才会创建csv文件

eg:

        # 创建文件
        f = open('长沙二手房数据.csv', mode='a', encoding='utf-8', newline='')
        csv_writer = csv.DictWriter(f, fieldnames=['标题', '小区', '地名', '房子基本信息',
                                                   '房价', '单价', '发布信息'])
        # 写入表头
        csv_writer.writeheader()
        '''
        '''
        csv_writer.writerow(dit)
        # dit 为写入数据,数据类型为:字典

读:

利用csv.reader可以读csv文件,然后返回一个可迭代的对象csv_read,我们可以直接从csv_read中取数据

eg:

with open('长沙二手房数据.csv', 'rt', newline='', encoding='utf-8', errors='ignore') as f:
    csv_read = csv.reader(f)
    for line in csv_read:
        print(type(line))
        print(line)

实战:爬虫爬取链家(长沙)二手房数据,并写入csv 文件中

import csv
import parsel
import requests


def downloadLianjia(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/81.0.4044.138 '
                      'Safari/537.36 '
    }
    response = requests.get(url=url, headers=headers)
    print(response.text)

    selector = parsel.Selector(response.text)
    lis = selector.css('.sellListContent li')
    for li in lis:
        # 标题
        title = li.css('.title a::text').get()
        # 地址
        positionInfo = li.css('.positionInfo a::text').getall()

        community = ''
        address = ''
        if len(positionInfo):
            # 小区
            community = positionInfo[0]
            # 地名
            address = positionInfo[1]
        # 房子基本信息
        houseInfo = li.css('.houseInfo::text').get()
        # 房价
        print('数据类型:', type(li.css('.totalPrice span::text').get()))
        txt = li.css('.totalPrice span::text').get()
        Price = ''
        if isinstance(txt, str):
            Price = li.css('.totalPrice span::text').get() + '万'
        # 单价
        print('单价数据类型:', type(li.css('.unitPrice span::text').get()))
        txt = li.css('.unitPrice span::text').get()
        unitPrice = ''
        if isinstance(txt, str):
            unitPrice = li.css('.unitPrice span::text').get().replace('单价', '')
        # 发布信息
        followInfo = li.css('.followInfo::text').get()
        dit = {
            '标题': title,
            '小区': community,
            '地名': address,
            '房子基本信息': houseInfo,
            '房价': Price,
            '单价': unitPrice,
            '发布信息': followInfo,
        }
        print(dit)

        # 创建文件
        f = open('长沙二手房数据.csv', mode='a', encoding='utf-8', newline='')
        csv_writer = csv.DictWriter(f, fieldnames=['标题', '小区', '地名', '房子基本信息',
                                                   '房价', '单价', '发布信息'])
        # 写入表头
        csv_writer.writeheader()
        '''
        '''
        csv_writer.writerow(dit)


for page in range(1, 101):
    url = 'https://cs.lianjia.com/ershoufang/'
    downloadLianjia(url)

实战:读取爬虫爬取链家(长沙)二手房数据,并进行数据清洗

import csv


def str2value(valueStr):
    valueStr = str(valueStr)
    idxOfYi = valueStr.find('亿')
    idxOfWan = valueStr.find('万')
    if idxOfYi != -1 and idxOfWan != -1:
        return int(float(valueStr[:idxOfYi])*1e8 + float(valueStr[idxOfYi+1:idxOfWan])*1e4)
    elif idxOfYi != -1 and idxOfWan == -1:
        return int(float(valueStr[:idxOfYi])*1e8)
    elif idxOfYi == -1 and idxOfWan != -1:
        return int(float(valueStr[idxOfYi+1:idxOfWan])*1e4)
    elif idxOfYi == -1 and idxOfWan == -1:
        return float(valueStr)


# 创建文件
f = open('长沙二手房数据清洗.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '小区', '地名', '房子基本信息',
                                           '房价', '单价', '发布信息'])
# 写入表头
csv_writer.writeheader()

with open('长沙二手房数据.csv', 'rt', newline='', encoding='utf-8', errors='ignore') as f:
    csv_read = csv.reader(f)
    for line in csv_read:
        if len(line):
            txt = line[0]
            if txt != '标题' and txt != '':
                print('总价', line[4])
                unitPrice = 0
                Price = 0
                if line[4].find('万') > 0:
                    Price = str2value(line[4])
                    print('是否包含万', str2value(line[4]))
                if line[5].find('元/平') > 0:
                    unitPrice = int(str(line[5].replace('元/平', '').replace(',', '')))
                    print('是否包含元/平', int(str(line[5].replace('元/平', '').replace(',', ''))))
                print('单价', line[5])
                print(line)
                dit = {
                    '标题': line[0],
                    '小区': line[1],
                    '地名': line[2],
                    '房子基本信息': line[3],
                    '房价': Price,
                    '单价': unitPrice,
                    '发布信息': line[6],
                }
                csv_writer.writerow(line)




附加:
python利用open打开文件的方式:

w:以写方式打开, 
a:以追加模式打开 (从 EOF 开始, 必要时创建新文件) 
r+:以读写模式打开 
w+:以读写模式打开 (参见 w ) 
a+:以读写模式打开 (参见 a ) 
rb:以二进制读模式打开 
wb:以二进制写模式打开 (参见 w ) 
ab:以二进制追加模式打开 (参见 a ) 
rb+:以二进制读写模式打开 (参见 r+ ) 
wb+:以二进制读写模式打开 (参见 w+ ) 
ab+:以二进制读写模式打开 (参见 a+ )

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值