一. 如何读写csv数据
实际案例
我们编写网络爬虫从豆瓣网爬取了一些书籍的信息, 以csv数据格式存储:
'''书名, 作者, 出版社, 价格
精通scrapy网络爬虫,刘硕, 清华大学出版社, 46.00
算法导论,Charles E.Leiserson, 人民邮电出版社, 85.00
Python灰帽子,Justin Seitz, 电子工业出版社, 39.00
......
'''
请将书价格高于 80.00 的书记录存储带另一个 csv 文件中
解决方案
-
标准库中的 csv模块, 使用其中reader和writer完成csv文件读写
import csv
with open('books.csv') as rf:
reader = csv.reader(rf)
headers = next(reader) # 头部行的内容
with open('books_out.csv', 'w') as wf:
writer = csv.writer(wf) # writer=csv.writer(wf, delimiter=' ') delimiter指定分隔符
writer.writerow(headers) # writerow 一行一行写入
for book in reader:
price = book[-1]
if price and float(price) >= 80.00:
writer.writerow(book)
二. 如何读写json数据
实际案例
在web应用中常用JSON(JavaScript Object Notation) 格式传输数据, 例如:
1. 利用 http://httpbin.org/API 对发送的http 请求进行观测
2. 爬虫程序利用 Splash 渲染引擎渲染页面
在python 中如何读写'json' 数据?
解决方案
问题一
import requests
r = requests.get('http://httpbin.org/headers')
r.content
#b'{\n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Connection": "close", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.18.4"\n }\n}\n'
r.text
#'{\n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Connection": "close", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.18.4"\n }\n}\n'
import json
d = json.loads(r.text) # 转化为字典
问题二
import json
d = json.loads(r.text) # 转化为字典
url = 'http://localhost:8050/render.html'
headers = {'content-type': 'application/json'}
data = {'url': 'http://jd.com', 'timeout': 20, 'images': 0}
jaon_data = json.dumps(data)
r2 = request.post(url, headers=headers, data=json_data)
r2.text # 获取相应网页内容
三. 如何解析简单的xml文档
实际案例
xml 是极为常用的标记性语言没可以提供统一的方法来描述应用程序的结构化数据:
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
</data>
python如何解析 xml 文档?
解决方案
-
使用标准库中的 xml.etree.ElementTree
from xml.etree import ElementTree
# 从字符串中解析
ElementTree.fromstring('相应字符串')
# 从文件中解析
et = ElementTree.parse('demo.xml')
root = et.getroot() # 获取根元素 data
root.tag # 当前tag data
c1 = list(root)[0] # 获取子元素列表 c1为列表中第一个 country
c1.attrib # {'name': "Liechtenstein"} attrib获取属性字典
c1.get('name') # Liechtenstein
year = list(c1)[1]
year.text # 得到year标签里的 2008
year.tail # '\n\t\t' 即 year标签与下一个标签 之间的 字符
c1.find('neighbor') # 在子元素中 找到 第一个neighbor标签
c1.findall('neighbor') # 在子元素中 找到 所有neighbor标签 得到 列表
list(root.iter('neighbor')) # 找到所有neighbor
# root.iter() 没有传入参数 则返回所有 元素
list[root.iterfind('./*/*[@name]')] # 使用xpath 表达式 查找
list(c1.itertext()) # 获取所有 text文本 包括 \n\t
# 过滤掉\n\t
' '.join(t for t in c1.itertext() if not t.isspace())
四. 如何构建xml文档
文档
某些时候, 我们需要将其他格式数据转化为xml, 例如把书籍信息csv文件, 转换成相应xml
books.csv:
数名, 作者, 出版社, 价格
精通scrapy网络爬虫, 刘硕, 清华大学出版社, 46.00
...
books.xml:
<Data>
<book>
<书名>精通scrapy网络爬虫</书名>
<作者>刘硕</作者>
<出版社>清华大学出版社</出版社>
<价格>46.00</价格>
</Book>
...
</Data>
解决方案
-
使用标准库中的 xml.etree.ElementTree, 构建ElementTree, 然后调用write 方法写入
import csv
from xml.etree.ElementTree import ElementTree, Element, SubElement
def csv_to_xml(csv_path, xml_path):
with open(csv_path) as f:
reader = csv.reader(f)
headers = next(reader)
root = Element('Data') # 创建根元素
root.text = '\n\t'
root.tail = '\n'
for row in reader:
book = SubElement(root, 'Book') # 给root创建一个子元素
book.text = '\n\t\t'
book.tail = '\n\t'
for tag, text in zip(headers, row):
e = SubElement(book, tag)
e.text = text
e.tail = '\n\t\t'
e.tail = '\n\t'
ElementTree(root).write(xml_path, encoding='utf8')
csv_to_xml('books.csv', 'books.xml')
五. 如何读写excel
实际案例
Microsoft Excel 是日常办公中使用最频繁的软件,
其数据格式为xls, xlsx, 是一种非常常用的电子表格
姓名 语文 数学 外语
李雷 95 99 96
韩梅 98 100 93
张峰 94 95 95
....
利用python读写excel 添加'总分'列, 计算每人总分
解决方案
-
使用pip 安装 xlrd 和 xlwt 两个库, 分别用于 读和写excel文件
import xlrd, xlwt
rbook = xlrd.open_workbook('demo.xlsx') # 打开excel文件
# 获取所有的 表 rbook.sheets() 一个excel文件 是有多个表构成的 即sheet 可以在文件底边看到当前是哪张表
rsheet = rbook.sheet_by_index(0) # 第一张表
k = rsheet.ncols # ncols 列 nrows 行
# 常用用法
# c00 = rsheet.cell(0,0) 获取0行 0列的 数据 是cell对象
# c00.ctype 得到1 即xlrd.XL_CELL_TEXT 文本类型 还有其他的类型 如数字 type为 2 xlrd.XL_CELL_NUMBER
# c00.value 得到内容 ‘姓名’
# rsheet.cell_value(0,0) 直接取到值
# 取整行
# rsheet.row(0) 得到 [text:'姓名', text:'语文 , text:'数学', text:'英语']
# rsheet.row_values(0) 得到 ['姓名', '语文 , '数学', '英语']
# rsheet.row_values(1, 1) 得到 [95, 99, 96] 第一个参数:第几行 第二个参数:从该行第几列开始取 第三个参数: 结束列,默认为 直到结束
# 取列的方法 与取行 类似
rsheet.put_cell(0, k, xlrd.XL_CELL_TEXT, '总分', None) # 添加元素
for i in range(1, rsheet.nrows):
t = sum(rsheet.row_values(i, 1)) # 算总分
rsheet.put_cell(i, k, xlrd.XL_CELL_NUMBER, t, None)
wbook = xlwt.Workbook()
wsheet = wbook.add_sheet(rsheet.name) # 表名不变
# 将原来的分数 和新添加的 总分 保存在新的excel文件中
for i in range(rsheet.nrows):
for j in range(rsheet.ncols):
wsheet.write(i, j, rsheet.cell_value(i, j))
wbook.save('out.xlsx')