正则补充,csv读取和写入,案例讲解


正则表达式----正则补充

import re

# s为待匹配的数据
s = "apple price is $22, banana price is $33"
# 需求--匹配到价格$22 $33
# .+匹配出换行符以外任意数量字符
# 一个括号就是一个分组
result = re.search(r'.+(\$\d+).+(\$\d+)',s)
print(result.group(0))
print(result.group(1))
print(result.group(2))
print(result.groups())

分组 把你要进行二次过滤得到数据用括号括起来
print(result.group(0)) 获取整个字符串
print(result.group(1)) 匹配第一个分组 $22
print(result.group(2)) 匹配第二个分组 $33
print(result.groups()) (‘$22’, ‘$33’) 把所有得到的分组放到元组里面统一返回
结果:
apple price is $22, banana price is $33
$22
$33
(‘$22’, ‘$33’)

csv读取和存储

写入csv文件

1 通过创建writer对象,主要用到2个方法。一个是writerow,写入一行。另一个是writerows写入多行 2
使用DictWriter 可以使用字典的方式把数据写入进去
with open(‘存储或者读取类型(Excel,csv等)’, ‘w’, encoding=‘utf-8’, newline=‘’) as file_obj:
newline = ‘’ 为了防止换行写入

第一种、写入方式

1、每次写入一行

首先通过csv.writer创建writer对象
再写入表头
最后通过循环利用writer.writerows§写入数据----writer.writerow()用于单行写入

import csv

# person 数据
person = [('xxx', 18, 180), ('yyy', 20, 182), ('zzz', 22, 181)]
# header 表头
header = ['name', 'age', 'height']
# 第一种写入方式
with open('person3.csv', 'w', encoding='utf-8', newline='') as file_obj:
    # newline = '' 为了防止换行写入
    # 通过创建writer对象,主要用到2个方法。一个是writerow,写入一行。另一个是writerows写入多行
    # 1、通过csv.writer创建writer对象
    writer = csv.writer(file_obj)
    # 2、写表头
    writer.writerow(header)
    # 3、写入数据(每次写入一行)
    for p in person:
        print(p)
        # 第一轮循环:p = ('xxx', 18, 180)
        # 第二轮循环:p = ('yyy', 20, 182)
        # 第三轮循环:p = ('zzz', 22, 181)
        writer.writerow(p)

2、多行写入

首先通过csv.writer创建writer对象
再写入表头
最后通过循环利用writer.writerows(person)写入数据----writer.writerows()用于多行写入

import csv

# person 数据
person = [('xxx', 18, 180), ('yyy', 20, 182), ('zzz', 22, 181)]
# header 表头
header = ['name', 'age', 'height']
# 第一种写入方式
with open('person3.csv', 'w', encoding='utf-8', newline='') as file_obj:
    # newline = '' 为了防止换行写入
    # 通过创建writer对象,主要用到2个方法。一个是writerow,写入一行。另一个是writerows写入多行
    # 1、通过csv.writer创建writer对象
    writer = csv.writer(file_obj)
    # 2、写表头
    writer.writerow(header)
    # 3、写入数据(一次写入多行)
    writer.writerows(person)

第二种、写入方式

当数据格式为字典格式时,可以使用第二种写入方式

首先通过csv.DictWriter创建dic对象
再写入表头,因为创建对象里面已传入表头,写入表头时不需要再传表头
最后通过循环利用writer.writerows(person)写入数据----writer.writerows()用于多行写入

import csv

# person 数据
person = [('xxx', 18, 180), ('yyy', 20, 182), ('zzz', 22, 181)]
# header 表头
header = ['name', 'age', 'height']
# persons 字典格式数据
persons = [
    {'name': 'xxx', 'age': 20, 'height': 180},
    {'name': 'yyy', 'age': 20, 'height': 180},
    {'name': 'zzz', 'age': 20, 'height': 180},
]

# 第二种写入方式(字典)
with open('person4.csv', 'w', encoding='utf-8', newline='') as file_obj:
    # 创建DictWriter对象
    dic = csv.DictWriter(file_obj, header)
    # 写入表头
    dic.writeheader()
    # 写入数据 注意数据的格式(需要是字典)
    dic.writerows(persons)

csv文件读取

1、通过reader()读取到的每一条数据是一个列表。可以通过下标的方式获取具体某一个值
2、通过DictReader()读取到的数据是一个字典。可以通过Key值(列名)的方式获取数据

第一种、读取方式

首先通过csv.reader创建reader对象
如果直接通过print(对象)读取出的对象像是#<_csv.reader object at 0x00000230FE508F28>
则直接通过循环遍历对象再输出数据

import csv

# 第一种读取数据
with open('person2.csv', 'r', encoding='utf-8') as file_obj:
    # 创建读取对象reader
    reader = csv.reader(file_obj)
    # 读取对象
    # print(reader)#<_csv.reader object at 0x00000230FE508F28>
    for r in reader:
        print(r)
        print(r[0]) #获取name数据
        print(r[1]) #获取age数据
        print(r[2]) #获取height数据

第二种、读取方式

import csv

# 第二种读取
with open('person2.csv', 'r', encoding='utf-8') as file_obj:
    # 创建读取对象reader
    reader = csv.DictReader(file_obj)
    # 读取对象
    # print(reader)
    # <csv.DictReader object at 0x000001DA45CE9708>
    for r in reader:
        print(r)
        print(r['name']) #获取name数据
        print(r['age']) #获取age数据
        print(r['height']) #获取height数据

天气预报案例

爬取天气预报里一周的天气信息
案例网址:天气预报

案例代码:

import re
import csv
import requests

'''
一天的天气情况数据是放在一个li标签里面的
七天数据,也就是在七个li标签里面是放在同一个ul标签里面的
'''
# 目标url
url = "http://www.weather.com.cn/weather/10121050108A.shtml"
# 请求头
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
}
# 创建响应对象
res = requests.get(url, headers=header)
# 通过res响应对象获取网页源码
html = res.content.decode('utf-8')
# print(html)

# 用正则网页源代码里面获取匹配数据
# result 有七天数据
result = re.search(r'<ul class="t clearfix">.*?</ul>', html, re.S)
# print(result.group())
li_list1 = re.findall(r'<li class=.*?>.*?</li>', result.group(), re.S)
li_list2 = re.findall(r'<li>.*?</li>', result.group(), re.S)
li_list1.extend(li_list2)
# print(li_list1)
data = []
for li in li_list1:
    # print(li)
    result_1 = re.search(
        r'.*?<h1>(.*?)</h1>.*?<p title=.*? class=.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<span title=(.*?) class=.*?></span>.*?<i>(.*?)</i>.*?',
        li, re.S)
    '''
    result_1.group(1) 日期
    result_1.group(2) 天气情况
    result_1.group(3) 最低温度 
    result_1.group(4) 风向
    result_1.group(5) 风级
    '''
    # 匹配到的数据,也可以通过group()下标索引
    print(result_1.groups())
    # print(result_1.group(1), result_1.group(2), result_1.group(3)

存储天气信息

第一种、存储方式

import re
import csv
import requests

# 目标url
url = "http://www.weather.com.cn/weather/10121050108A.shtml"
# 请求头
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
}
# 创建响应对象
res = requests.get(url, headers=header)
# 通过res响应对象获取网页源码
html = res.content.decode('utf-8')
result = re.search(r'<ul class="t clearfix">.*?</ul>', html, re.S)
# print(result.group())
li_list1 = re.findall(r'<li class=.*?>.*?</li>', result.group(), re.S)
li_list2 = re.findall(r'<li>.*?</li>', result.group(), re.S)
li_list1.extend(li_list2)
# print(li_list1)
data = []
for li in li_list1:
    # print(li)
    result_1 = re.search(
        r'.*?<h1>(.*?)</h1>.*?<p title=.*? class=.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<span title=(.*?) class=.*?></span>.*?<i>(.*?)</i>.*?',
        li, re.S)
    one_day = result_1.groups()
    data.append(one_day)
# print(data)
header = ['日期', '天气情况', '最低温度', '风向','风级']
with open("weather1.csv", 'w', encoding='utf-8', newline='') as file_obj:
    writer = csv.writer(file_obj)
    writer.writerow(header)
    writer.writerows(data)

第二种、存储方式

import re
import csv
import requests

'''
一天的天气情况数据是放在一个li标签里面的
七天数据,也就是在七个li标签里面是放在同一个ul标签里面的
'''
# 目标url
url = "http://www.weather.com.cn/weather/10121050108A.shtml"
# 请求头
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
}
# 创建响应对象
res = requests.get(url, headers=header)
# 通过res响应对象获取网页源码
html = res.content.decode('utf-8')
# print(html)

# 用正则网页源代码里面获取匹配数据
# result 有七天数据
result = re.search(r'<ul class="t clearfix">.*?</ul>', html, re.S)
# print(result.group())
li_list1 = re.findall(r'<li class=.*?>.*?</li>', result.group(), re.S)
li_list2 = re.findall(r'<li>.*?</li>', result.group(), re.S)
li_list1.extend(li_list2)
# print(li_list1)
data = []
for li in li_list1:
    # print(li)
    item = {}
    result_1 = re.search(
        r'.*?<h1>(.*?)</h1>.*?<p title=.*? class=.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<span title=(.*?) class=.*?></span>.*?<i>(.*?)</i>.*?',
        li, re.S)
    item['日期'] = result_1.group(1)
    item['天气情况'] = result_1.group(2)
    item['最低温度'] = result_1.group(3)
    item['风向'] = result_1.group(4)
    item['风级'] = result_1.group(5)
    # print(item)
    data.append(item)
    '''
    result_1.group(1) 日期
    result_1.group(2) 天气情况
    result_1.group(3) 最低温度 
    result_1.group(4) 风向
    result_1.group(5) 风级
    '''
    # 匹配到的数据,也可以通过group()下标索引
    # print(result_1.groups())
    # print(result_1.group(1), result_1.group(2), result_1.group(3), result_1.group(4),result_1.group(5))
    # print('-' * 100)
    # one_day存储一天天气

#     one_day = result_1.groups()
#     data.append(one_day)
# # print(data)
header = ['日期', '天气情况', '最低温度', '风向', '风级']
# with open("weather1.csv", 'w', encoding='utf-8', newline='') as file_obj:
#     writer = csv.writer(file_obj)
#     writer.writerow(header)
#     writer.writerows(data)
# 字典写入时表头要和字典里面key需要一一对应
with open("weather2.csv", 'w', encoding='utf-8', newline='') as file_obj:
    writer = csv.DictWriter(file_obj, header)
    writer.writeheader()
    writer.writerows(data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猩猩文学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值