5. 数据读写与构建相关问题和技巧

一. 如何读写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')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值