当前位置:   article > 正文

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

正则 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())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

分组 把你要进行二次过滤得到数据用括号括起来
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

第二种、写入方式

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

首先通过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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

第二种、读取方式

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数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

天气预报案例

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

案例代码:

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

存储天气信息

第一种、存储方式

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

第二种、存储方式

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/979712
推荐阅读
相关标签
  

闽ICP备14008679号