CSV
- 含义:CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式,用以存储表格数据,包括数字或者字符。很多程序在处理数据时都会碰到csv这种格式的文件。python自带了csv模块,专门用于处理csv文件的读取
- 写入CSV文件:
- 1 通过创建writer对象,主要用到2个方法。一个是writerow,写入一行。另一个是writerows写入多行
- 2 使用DictWriter 可以使用字典的方式把数据写入进去
# import csv
# #定义表头,只要是能够遍历就可以,迭代器,可迭代对象。。。
# headers = ('name','age','height')
# #添加测试数据
# persons = [
# ('小猪佩奇',18,175),
# ('奥特曼',29,190),
# ('猪猪侠',10,150),
# ]
#
# # with open('test.csv','w',encoding='utf-8') as f:
# # write = csv.writer(f)
# # write.writerow(headers) #writerow是一行一行的写入
# # for data in persons:
# # write.writerow(data)
#
# with open('rows.csv','w',encoding='utf-8') as f:
# write = csv.writer(f)
# write.writerow(headers)
# write.writerows(persons) #writerrows批量写入
##########################################
#通过DictWrite对象
import csv
headers = ('name','age','height')
#添加测试数据
persons = [
{'name':'佩奇',"age":18,'height':161},
{'name':'猪猪侠',"age":22,'height':181},
{'name':'奥特曼',"age":31,'height':172},
]
# with open('dict.csv','w',encoding='utf-8') as f:
# Dwrite = csv.DictWriter(f,headers) #通过字典的方式写入
# Dwrite.writeheader()
# Dwrite.writerows(persons)
#通过上面的方式写入我们发现保存的文件上下行之间会有空行,如果我们需要去掉空行可以添加newline='',如下:
with open('dict2.csv','w',encoding='utf-8',newline='') as f:
Dwrite = csv.DictWriter(f,headers)
Dwrite.writeheader()
Dwrite.writerows(persons)
#csv保存方式思路总结:
#1.创建writed对象 write = csv.writer(f) 或者创建字典格式的 Dwrite = csv.DictWriter(f,headers)
#2.写入表头 write.writerow(headers)
#3.写入数据 write.writerow(data) 批量写入 write.write.writerows
- CSV文件的读取:
- 1 通过reader()读取到的每一条数据是一个列表。可以通过下标的方式获取具体某一个值
- 2 通过DictReader()读取到的数据是一个字典。可以通过Key值(列名)的方式获取数据
import csv
with open('dict2.csv','r',encoding='utf-8') as f:
read = csv.reader(f)
for i in read:
print(i)
#输出结果如下
['name', 'age', 'height']
['佩奇', '18', '161']
['猪猪侠', '22', '181']
['奥特曼', '31', '172']
import csv
with open('dict2.csv','r',encoding='utf-8') as f:
read = csv.DictReader(f)
for i in read:
print(i)
#输出结果如下:
OrderedDict([('name', '佩奇'), ('age', '18'), ('height', '161')])
OrderedDict([('name', '猪猪侠'), ('age', '22'), ('height', '181')])
OrderedDict([('name', '奥特曼'), ('age', '31'), ('height', '172')])
通过re&正则的方式爬取天气网
-
确定要爬取的url: http://www.weather.com.cn/weather/101040100.shtml
-
确定要获取的数据: 重庆市七天的日期,天气,温度。风力
-
分析网页结构:
-
通过分析发现,七天的天气信息都包含在ul的标签里,所以我可以先获取到ul的内容。
-
下面的每个li标签对应的是一天的天气信息,所以在获取到ul后接着去获取li标签的内容
- -
我们发现我们所需要的信息都在下面可以找到,那么我们可以通过正则进一步的去匹配获取所需数据。
-
将数据保存为CSV格式
-
代码如下:
import re
import requests
import csv
class Weather:
# 定义目标url以及headers信息
def __init__(self):
self.url = 'http://www.weather.com.cn/weather/101040100.shtml'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
# 获取网页源码
def Get_Html(self):
html = requests.get(url=self.url, headers=self.headers)
return html.content.decode('utf-8')
# 通过正则的方式解析数据
def parse_html(self):
resoult = self.Get_Html()
uls = re.match(r'.*?(<ul class="t clearfix">.*?</ul>).*?', resoult, re.S).group(1)
lis = re.findall(r'<li.*?>.*?</li>', uls, re.S)
pattern = re.compile(r'<li.*?">.*?<h1>(.*?)</h1>.*?<p.*?>(.*?)</p>.*?<i>(.*?)</i>.*?<i>(.*?)</i>.*?</li>', re.S)
lists = []
for i in lis:
r = pattern.match(i)
lit = [r.group(1), r.group(2), r.group(3), r.group(4)]
lists.append(lit)
return lists
def save_data(self):
data = self.parse_html()
# print(data)
title = ("日期", '天气', '温度', '风力')
with open('天气.csv', 'w', encoding='utf-8', newline='') as f:
write = csv.writer(f)
write.writerow(title)
write.writerows(data)
if __name__ == '__main__':
res = Weather()
res.save_data()
结果如下:
这样就能通过exec表格打开了