共计 3584 个字符,预计需要花费 9 分钟才能阅读完成。
第一次补课 – 第七节课后
csv 写入与读取
1. 写入文件
(1)通过创立 writer 对象,应用列表的形式,次要用到两个办法:一个是 writerow,每次写入一行;一个是 writerows,每次写入多行,只需写入一次
import csv
import pandas as pd
# 第一种写入形式 writerow
person =[('你猜', 18, 180), ('不猜', 20, 182), ('我猜', 22, 184),
]
# 表头
header = ('name', 'age', 'height')
# w--> 写 如果 office 关上乱码了 须要改成 utf-8-sig newline--> 换行
with open('person.csv', 'w', encoding='utf-8', newline='') as file_obj:
writer = csv.writer(file_obj)
writer.writerow(header) # 把表头写进去
for i in person:
writer.writerow(i) # 把内容写进去
# 第二种写入形式 writerows
person =[('你猜', 18, 180), ('不猜', 20, 182), ('我猜', 22, 184),
]
header = ('name', 'age', 'height')
with open('person2.csv', 'w', encoding='utf-8', newline='') as file_obj:
writer = csv.writer(file_obj)
writer.writerow(header) # 把表头写进去
writer.writerows(person) # 把内容写进去
(2)通过创立 DictWriter 对象 即应用字典的形式写入数据
# 第三种写入形式 -- 字典
person = [{'name': '你在', 'age': 18, 'height': 180},
{'name': 'yyy', 'age': 20, 'height': 182},
{'name': 'zzz', 'age': 22, 'height': 184}
]
header = ('name', 'age', 'height')
with open('dict_person.csv', 'w', encoding='utf-8', newline='') as f:
DictWrite = csv.DictWriter(f, header)
DictWrite.writeheader() # 写入表头
DictWrite.writerows(person) # 写入内容
附注:
# 不必 with 就要手动敞开:close()
f_obj = open('dict_person2.csv', 'w', encoding='utf-8', newline='')
DictWrite = csv.DictWriter(f_obj, header)
# 写入表头
DictWrite.writeheader()
DictWrite.writerows(person)
f_obj.close()
2. 读取文件
(1)通过 reader()读取到的每一个数据是一个列表,即能够通过下标的形式获取具体某一个值
# 第一种读取形式 读取进去的元素是列表
with open('person.csv', 'r', encoding='utf-8') as g:
r = csv.reader(g)
# print(r, type(r))
for i in r:
print(i[0], i[1], i[2])
(2)通过 DictReader()读取到的数据是一个字典,即能够通过 key 的形式获取数据
with open('person2.csv', 'r', encoding='utf-8') as h:
r = csv.DictReader(h)
# print(type(r), r)
for i in r:
print(i['name'], i['age'], i['height'])
面向对象
# 类属性 实例属性 类办法 实例办法
class A:
# 类属性:间接在类中定义的属性
# 特点:1. 能够通过类对象和实例对象拜访
# 2. 能够通过类对象批改 但不能通过实例对象批改(增加实例对象属性,而不是类属性)number = 99
def __init__(self):
# name 是实例属性 通过 self.xxx 的都是实例属性
# self 是指对象自身
# 实例对象能够拜访和批改实例属性 类对象不能拜访实例属性
self.name = 'python'
# 实例办法:是在类中定义的 第一个参数是 self
def test(self):
print('实例办法')
# 类办法:应用 @classmethod 润饰的办法是类办法 第一个参数是 cls
# 类办法能够通过类对象调用 也能够通过实例对象调用
@classmethod
def test2(cls):
print('类办法')
print(A.number) # 调用类属性
# a 是一个实例对象
a = A()
# 通过实例对象增加的属性就是实例属性
a.number = 1314
print(a.number) # 实例属性
print(A.number) # 类属性
print(a.name) # 实例属性能够通过实例对象调用
print(A.name) # 报错
a.name = 'hello'
print(a.name) # 实例属性能够通过实例对象批改
a.test() # 调用 test 办法
A.test() # 报错
A.test(a) # 等价于 a.test() 类对象 须要手动传递?A.test2()
a.test2()
案例 – 爬取天气
指标 :爬取某城市 7 天的天气状况(日期、天气、温度、风力)
实现步骤:
1. 向指标 url 发动申请 获取网页源代码(html 文件)
2. 页面剖析
(1)在网页源代码种匹配 ul 标签(正则)
(2)持续解析 ul 标签中的 li 标签数据(正则)
3. 通过 csv 保留数据
import requests
import re
import csv
# 指标 url
url = 'http://www.weather.com.cn/weather/101110101.shtml'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
# 1. 向指标 url 发动申请 获取网页源代码
res = requests.get(url, headers=headers)
html = res.content.decode('utf-8')
# print(res.content.decode('utf-8')) # 全部内容
# 2. 解析数据
# 在网页源代码中匹配 ul 标签
# re.S 换行匹配
ul = re.match(r'.*?(<ul class="t clearfix">.*?</ul>).*', html, re.S)
# ul_data1 = ul.group() # 全部内容
# print(ul_data1)
ul_data2 = ul.group(1)
# print(ul_data2)
# 在网页源代码中匹配 li 标签
lis = re.findall(r'.*?(<li class=".*?">.*?</li>).*?', ul_data2, re.S)
# print(lis)
# 最初有? 问号的话 7 天信息都会示意进去;没有? 问号的话 只有一天的信息示意进去
# 贮存所有数据的大列表
lst_data = []
for li in lis:
# 贮存某一天数据的字典
li_dict = {}
# print(li)
# print('*' * 100)
pat = re.compile(r'.*?<h1>(.*?)</h1>.*?<p.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<i>(.*?)</i>', re.S)
li_data = pat.match(li)
# print(li_data.group(1), end=' ')
# print(li_data.group(2), end=' ')
# print(li_data.group(3), end=' ')
# print(li_data.group(4), end=' ')
# print()
li_dict = {'日期': li_data.group(1), '天气': li_data.group(2), '温度': li_data.group(3), '风力': li_data.group(4)}
print(li_dict)
lst_data.append(li_dict)
header = ['日期', '天气', '温度', '风力']
with open('weather.csv', 'w', encoding='utf-8', newline='') as f:
w = csv.DictWriter(f, header)
w.writeheader()
w.writerows(lst_data)
正文完