2Python进阶强化训练之csv|json|xml|excel高

Python进阶强化训练之csv|json|xml|excel高

如何读写csv数据?

实际案例

我们可以通过http://table.finance.yahoo.com/table.csv?s=000001.sz,这个url获取中国股市(深市)数据集,它以csv数据格式存储:


Date,Open,High,Low,Close,Volume,Adj Close
2016-09-15,9.06,9.06,9.06,9.06,000,9.06
2016-09-14,9.17,9.18,9.05,9.06,42148100,9.06
2016-09-13,9.18,9.21,9.14,9.19,46093100,9.19
2016-09-12,9.29,9.32,9.13,9.16,75658100,9.16
2016-09-09,9.40,9.43,9.36,9.38,32743100,9.38
2016-09-08,9.39,9.42,9.38,9.40,29521800,9.40
2016-09-07,9.41,9.42,9.37,9.40,45937300,9.40
2016-09-06,9.42,9.43,9.36,9.41,57473800,9.41
2016-09-05,9.46,9.46,9.40,9.42,46993600,9.42
2016-09-02,9.43,9.46,9.42,9.45,36879600,9.45
2016-09-01,9.49,9.52,9.42,9.45,48013100,9.45
2016-08-31,9.46,9.50,9.43,9.49,48974600,9.49
2016-08-30,9.42,9.47,9.41,9.47,59508100,9.47
2016-08-29,9.41,9.45,9.38,9.42,56523100,9.42
2016-08-26,9.45,9.47,9.40,9.45,50223300,9.45
2016-08-25,9.42,9.45,9.34,9.44,61738900,9.44
2016-08-24,9.41,9.43,9.38,9.43,73228100,9.43

请将平安银行这支股票,在2016年中成交量超过14000000的记录存储到另一个csv文件中

解决方案

使用标准库中的csv模块,可以使用其中readerwriter完成文件读写

下载数据

>>> from urllib import urlretrieve
# 获取平安银行股票信息,保存到pingan.csv文件中
>>> urlretrieve(‘http://table.finance.yahoo.com/table.csv?s=000001.sz‘, ‘pingan.csv‘)
(‘pingan.csv‘, <httplib.HTTPMessage instance at 0x1a997e8>)

使用csv模块进行读

>>> import csv
>>> rf = open(‘pingan.csv‘, ‘rb‘)
>>> reader = csv.reader(rf)
# 获取的对象是一个可迭代的
>>> reader.next()
[‘Date‘, ‘Open‘, ‘High‘, ‘Low‘, ‘Close‘, ‘Volume‘, ‘Adj Close‘]
>>> reader.next()
[‘2016-09-15‘, ‘9.06‘, ‘9.06‘, ‘9.06‘, ‘9.06‘, ‘000‘, ‘9.06‘]

使用csv模块进行写

>>> wf = open(‘pingan_copy.csv‘, ‘wb‘)
>>> writer = csv.writer(wf)
>>> writer.writerow([‘2016-09-14‘, ‘9.17‘, ‘9.18‘, ‘9.05‘, ‘9.06‘, ‘42148100‘, ‘9.06‘])
>>> writer.writerow(reader.next())                                                     
>>> wf.flush()

查看写入的文件内容

[[email protected] ~]# cat pingan_copy.csv 
2016-09-14,9.17,9.18,9.05,9.06,42148100,9.06
2016-09-13,9.18,9.21,9.14,9.19,46093100,9.19

如上的问题解决方案如下:

#!/use/bin/env python
# _*_ coding:utf-8 _*_

import csv

with open(‘pingan.csv‘, ‘rb‘) as rf:
    reader = csv.reader(rf)
    with open(‘pingan2016.csv‘, ‘wb‘) as wf:
        writer = csv.writer(wf)
        headers = reader.next()
        writer.writerow(headers)
        for row in reader:
            if row[0] < ‘2016-01-01‘:
                break
            if int(row[5]) >= 50000000:
                writer.writerow(row)

如何读写json数据?

实际案例

在web应用中常用JSON(JavaScript Object Notation)格式传输数据,在python中如何读写json数据?

解决方案

使用标准库中的json模块,其中loadsdumps函数可以完成json数据的读写

将数据类型转换为字符串

>>> import json
# 创建一个列表
>>> l = [1,2,‘asd‘,{‘blgo_url‘,‘ansheng.me‘}]
# 使用dumps转换为字符串
>>> json.dumps(l)
‘[1, 2, "asd", {"blgo_url": "ansheng.me"}]‘
# 去掉空格
>>> json.dumps(l, separators=[‘,‘,‘:‘])
‘[1,2,"asd",{"blgo_url":"ansheng.me"}]‘
# 排序
>>> d = {‘b‘:None,‘a‘:‘111‘,‘g‘:‘Null‘}
>>> json.dumps(d, sort_keys=True)
‘{"a": "111", "b": null, "g": "Null"}‘

将字符串转换为数据类型

>>> json.loads(‘[1,2,"asd",{"blgo_url":"ansheng.me"}]‘)
[1, 2, ‘asd‘, {‘blgo_url‘: ‘ansheng.me‘}]

如何解析简单的xml文档?

实际案例

如以下XML文档,如何使用python进行解析?

<?xml version="1.0" encoding="utf-8" ?>
<data>
    <country name="Liechtenstein">
        <rank update="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank update="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank update="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

解决方案

可以使用标准库中的xml.etree.ElementTree,其中的parse函数可以解析XML文档

# 导入parse
>>> from xml.etree.ElementTree import parse
>>> f = open(‘a.xml‘)
# 获得ElementTree对象
>>> et = parse(f)
# 获取根节点,也就是data
>>> root = et.getroot()
>>> root
<Element ‘data‘ at 0x00000203ECA1E728>
# 查看标签
>>> root.tag
‘data‘
# 属性
>>> root.attrib
{}
# 文本
>>> root.text.strip()
‘‘
# 获得一个节点的子元素,然后在获取每个子元素的属性
>>> for child in root: print(child.get(‘name‘))
...
Liechtenstein
Singapore
Panama
# 根据标签寻找子元素,每次之寻找第一个
>>> root.find(‘country‘)
<Element ‘country‘ at 0x00000203ECBD3228>
# 寻找所有
>>> root.findall(‘country‘)
[<Element ‘country‘ at 0x00000203ECBD3228>, <Element ‘country‘ at 0x00000203ECBDBC28>, <Element ‘country‘ at 0x00000203ECBDBDB8>]
# 获得一个生成器对象
>>> root.iterfind(‘country‘)
<generator object prepare_child.<locals>.select at 0x00000203ECBC5FC0>
>>> for e in root.iterfind(‘country‘): print(e.get(‘name‘))
...
Liechtenstein
Singapore
Panama
# 获取所有的元素节点
>>> list(root.iter())
[<Element ‘data‘ at 0x00000203ECA1E728>, <Element ‘country‘ at 0x00000203ECBD3228>, <Element ‘rank‘ at 0x00000203ECBDBA98>, <Element ‘year‘ at 0x00000203ECBDBAE8>, <Element ‘gdppc‘ at 0x00000203ECBDBB38>, <Element ‘neighbor‘ at 0x00000203ECBDBB88>, <Element ‘neighbor‘ at 0x00000203ECBDBBD8>, <Element ‘country‘ at 0x00000203ECBDBC28>, <Element ‘rank‘ at 0x00000203ECBDBC78>, <Element ‘year‘ at 0x00000203ECBDBCC8>, <Element ‘gdppc‘ at 0x00000203ECBDBD18>, <Element ‘neighbor‘ at 0x00000203ECBDBD68>, <Element ‘country‘ at 0x00000203ECBDBDB8>, <Element ‘rank‘ at 0x00000203ECBDBE08>, <Element ‘year‘ at 0x00000203ECBDBE58>, <Element ‘gdppc‘ at 0x00000203ECBDBEA8>, <Element ‘neighbor‘ at 0x00000203ECBDBEF8>, <Element ‘neighbor‘ at 0x00000203ECBDBF48>]
# 寻找标签为rank的子节点
>>> list(root.iter(‘rank‘))
[<Element ‘rank‘ at 0x00000203ECBDBA98>, <Element ‘rank‘ at 0x00000203ECBDBC78>, <Element ‘rank‘ at 0x00000203ECBDBE08>]

查找的高级用法

# 匹配country下的所有子节点
>>> root.findall(‘country/*‘)
[<Element ‘rank‘ at 0x00000203ECBDBA98>, <Element ‘year‘ at 0x00000203ECBDBAE8>, <Element ‘gdppc‘ at 0x00000203ECBDBB38>, <Element ‘neighbor‘ at 0x00000203ECBDBB88>, <Element ‘neighbor‘ at 0x00000203ECBDBBD8>, <Element ‘rank‘ at 0x00000203ECBDBC78>, <Element ‘year‘ at 0x00000203ECBDBCC8>, <Element ‘gdppc‘ at 0x00000203ECBDBD18>, <Element ‘neighbor‘ at 0x00000203ECBDBD68>, <Element ‘rank‘ at 0x00000203ECBDBE08>, <Element ‘year‘ at 0x00000203ECBDBE58>, <Element ‘gdppc‘ at 0x00000203ECBDBEA8>, <Element ‘neighbor‘ at 0x00000203ECBDBEF8>, <Element ‘neighbor‘ at 0x00000203ECBDBF48>]
# 找到所有节点的rank
>>> root.findall(‘.//rank‘)
[<Element ‘rank‘ at 0x00000203ECBDBA98>, <Element ‘rank‘ at 0x00000203ECBDBC78>, <Element ‘rank‘ at 0x00000203ECBDBE08>]
# 找到rank的父对象
>>> root.findall(‘.//rank/..‘)
[<Element ‘country‘ at 0x00000203ECBD3228>, <Element ‘country‘ at 0x00000203ECBDBC28>, <Element ‘country‘ at 0x00000203ECBDBDB8>]
# 查找country包含name属性的
>>> root.findall(‘country[@name]‘)
[<Element ‘country‘ at 0x00000203ECBD3228>, <Element ‘country‘ at 0x00000203ECBDBC28>, <Element ‘country‘ at 0x00000203ECBDBDB8>]
>>> root.findall(‘country[@age]‘)
[]
# 查找属性等于特定值的元素
>>> root.findall(‘country[@name="Singapore"]‘)
[<Element ‘country‘ at 0x00000203ECBDBC28>]
# 查找必须包含某一个子元素
>>> root.findall(‘country[rank]‘)
[<Element ‘country‘ at 0x00000203ECBD3228>, <Element ‘country‘ at 0x00000203ECBDBC28>, <Element ‘country‘ at 0x00000203ECBDBDB8>]
# 查找子元素等于指定的值
>>> root.findall(‘country[rank="5"]‘)
[<Element ‘country‘ at 0x00000203ECBDBC28>]
# 根据位置查找,从1开始
>>> root.findall(‘country‘)
[<Element ‘country‘ at 0x00000203ECBD3228>, <Element ‘country‘ at 0x00000203ECBDBC28>, <Element ‘country‘ at 0x00000203ECBDBDB8>]
# 根据位置查找
>>> root.findall(‘country[1]‘)
[<Element ‘country‘ at 0x00000203ECBD3228>]
# 倒数第一个
>>> root.findall(‘country[last()]‘)
[<Element ‘country‘ at 0x00000203ECBDBDB8>]
# 倒数第二个
>>> root.findall(‘country[last()-1]‘)
[<Element ‘country‘ at 0x00000203ECBDBC28>]

如何构建xml文档?

实际案例

某些时候,我们需要将其他格式数据转换为xml,例如下面的字符串如何转换为XML?

z

解决方案

使用标准库中的xml.etree.ElementTree,构建ElementTree,使用write方法写入文件

>>> from xml.etree.ElementTree import Element, ElementTree
>>> from xml.etree.ElementTree import tostring
>>> e = Element(‘Data‘)
>>> e.set(‘name‘, ‘abc‘)
>>> e.text = ‘123‘
# 查看结果
>>> tostring(e)
b‘<Data name="abc">123</Data>‘
>>> e2 = Element(‘Row‘)
>>> e3 = Element(‘Open‘)
>>> e3.text = ‘9.17‘
>>> e2.append(e3)
>>> e.text = None
>>> e.append(e2)
>>> tostring(e)
b‘<Data name="abc"><Row><Open>9.17</Open></Row></Data>‘
>>> et = ElementTree(e)
>>> et.write(‘demo.xml‘)

解决如上问题的脚本如下:

import csv
from xml.etree.ElementTree import Element, ElementTree

def pretty(e, level=0):
    if len(e) > 0:
        e.text = ‘\n‘ + ‘\t‘ * (level + 1)
        for child in e:
            pretty(child, level + 1)
        child.tail = child.tail[:-1]
    e.tail = ‘\n‘ + ‘\t‘ * level
    
def csvToXML(fname):
    with open(fname, ‘rb‘) as f:
        reader = csv.reader(f)
        headers = reader.next()
        root = Element(‘Data‘)
        for row in reader:
            eRow = Element(‘Row‘)
            root.append(eRow)
            for tag, text in zip(headers, row):
                e = Element(tag)
                e.text = text
                eRow.append(e)
    pretty(root)
    return ElementTree(root)
    
et = csvToXML(‘pingan.csv‘)
et.write(‘pingan.xml‘)

转换好的文件内容为:

<Data>
        <Row>
                <Date>2016-09-15</Date>
                <Open>9.06</Open>
                <High>9.06</High>
                <Low>9.06</Low>
                <Close>9.06</Close>
                <Volume>000</Volume>
                <Adj Close>9.06</Adj Close>
        </Row>
        <Row>
                <Date>2016-09-14</Date>
                <Open>9.17</Open>
                <High>9.18</High>
                <Low>9.05</Low>
                <Close>9.06</Close>
                <Volume>42148100</Volume>
                <Adj Close>9.06</Adj Close>
        </Row>
        .....

如何读写excel文件?

实际案例

Microsoft Excel是日常办公中使用最频繁的软件,起数据格式为xls,xlsx,一种非常常用的电子表格。

某小学某班成绩记录在excel了文件中,内容如下:

姓名    语文    数学    外语
小明    95    96    94
张三    85    84    92
王五    86    85    75
小哈    96    92    100

利用python读写excel了,添加总分列,计算每人总分

解决方案

使用第三方库xlrd和xlwt,这两个库分别用于excel读和写

安装这两个模块

pip3 install xlrd
pip3 install xlwt

脚本如下:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

# 导入xlrd和xlwt
import xlrd
import xlwt

# 打开excel文件
rbook = xlrd.open_workbook(‘x.xlsx‘)
# 表
rsheet = rbook.sheet_by_index(0)

# 添加一个总分的列
# 列
nc = rsheet.ncols
# 第0行,列,文本类型,文字,内容
rsheet.put_cell(0, nc, xlrd.XL_CELL_TEXT, ‘总分‘, None)

# 迭代表中的所有数据,计算总分
for row in range(1, rsheet.nrows):
    # 计算每行的总分,跳过第0行,0==姓名,sum对列表进行求和,t等于最后加上拿出来的分数
    t = sum(rsheet.row_values(row, 1))
    # 写入数据
    rsheet.put_cell(row, nc, xlrd.XL_CELL_NUMBER, t, None)
    
# 写入到文件中
wbook = xlwt.Workbook()
wsheet = wbook.add_sheet(rsheet.name)

# 对其方式,垂直和水平都是剧中
style = xlwt.easyxf(‘align: vertical center, horizontal center‘)
# rsheet的每个单元格写入到wsheet中
for r in range(rsheet.nrows):  # 行
    for c in range(rsheet.ncols):  # 列
        wsheet.write(r, c, rsheet.cell_value(r, c), style)
        
wbook.save(‘output.xlsx‘)

计算结果如下:

姓名    语文    数学    外语    总分
小明    95    96    94    285
张三    85    84    92    261
王五    86    85    75    246
小哈    96    92    100    288

#Python

时间: 2024-10-16 20:55:23

2Python进阶强化训练之csv|json|xml|excel高的相关文章

1Python进阶强化训练之装饰器使用技巧进阶

Python进阶强化训练之装饰器使用技巧进阶 如何使用函数装饰器? 实际案例 某些时候我们想为多个函数,统一添加某种功能,比如记时统计.记录日志.缓存运算结果等等. 我们不想在每个函数内一一添加完全相同的代码,有什么好的解决方案呢? 解决方案 定义装饰奇函数,用它来生成一个在原函数基础添加了新功能的函数,替代原函数 如有如下两道题: 题目一 斐波那契数列又称黄金分割数列,指的是这样一个数列:1,1,2,3,5,8,13,21,-.,这个数列从第三项开始,每一项都等于前两项之和,求数列第n项. 题

python cookbook第三版学习笔记七:python解析csv,json,xml文件

CSV文件读取: Csv文件格式如下:分别有2行三列. 访问代码如下: f=open(r'E:\py_prj\test.csv','rb') f_csv=csv.reader(f) for f in f_csv:     print f 在这里f是一个元组,为了访问某个字段,需要用索引来访问对应的值,如f[0]访问的是first,f[1]访问的是second,f[2]访问的是third. 用列索引的方式很难记住.一不留神就会搞错.可以考虑用对元组命名的方式 这里介绍namedtuple的方法.

python进阶强化学习

最近学习了慕课的python进阶强化训练,将学习的内容记录到这里,同时也增加了很多相关知识. 主要分为以下九个模块: 基本使用 迭代器和生成器 字符串 文件IO操作 自定义类和类的继承 函数装饰器和类的装饰器 进程和线程 内存管理和垃圾回收机制 基本使用 基本的数据包括:list,tuple(元组),set(集合)和dict(字典).heapq.queue 处理的实际问题是:过滤列表中的负数 解决方案: 列表解析,最好的方式 字典,使用字典的方式和使用列表的方式差不多,都是对value做判断,但

JSON &amp; XML 简析

转载自:http://my.oschina.net/aofe/blog/269260 JSON: XML: JSON格式说明: HTML & XML 的对比 HTML: XML: HTML5新特性: NSXMLParser解析方法: SAX(Simple API for XML)特点: DOM(Document Object Model)特点: NSXMLParser解析过程: XML目前应用场景: JSON & XML JSON: JSON是基于JavaScript的一个子集: 作为一种

Java编程的逻辑 (63) - 实用序列化: JSON/XML/MessagePack

上节,我们介绍了Java中的标准序列化机制,我们提到,它有一些重要的限制,最重要的是不能跨语言,实践中经常使用一些替代方案,比如XML/JSON/MessagePack. Java SDK中对这些格式的支持有限,有很多第三方的类库,提供了更为方便的支持,Jackson是其中一种,它支持多种格式,包括XML/JSON/MessagePack等,本文就来介绍如果使用Jackson进行序列化.我们先来简单了解下这些格式以及Jackson. 基本概念 XML/JSON都是文本格式,都容易阅读和理解,格式

JSON/XML序列化与反序列化(非构造自定义类)

隔了很长时间再重看自己的代码,觉得好陌生..以后要养成多注释的好习惯..直接贴代码..对不起( ▼-▼ ) 保存保存:进行序列化后存入应用设置里 ApplicationDataContainer _appSettings = ApplicationData.Current.LocalSettings; //这个是保存一些页面输入信息 private async void Save_Click(object sender, RoutedEventArgs e) { if (userName.Tex

[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类

[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能不了解Json.net(Newtonsoft.Json)这款世界级的开源类库,除了拥有良好的性能之外,功能也是非常强大的. 本节会详细说明这个类库.此外,对于不喜欢使用第三方类库的同学,会整理一个基于微软类库的通用Json类. 读前必备: 本节主要介绍一款第三方类库和一个自己整理封装的类库,说起到封装

JSON&amp;XML 解析总结

JSON & XML解析 JSON(数据传输): JSON具有对象(字典)和数组两种数据格式.字典用“{}”,数组用“[]”.其实也是key-value(字符串,数值,布尔类型,对象,空对象,数组)键值对. JSON 可以与Object-C相互转换  ->则是JSON的解析过程(正向与逆向的解析-为了说明自己定义的正逆)->可用于数据的持久化,将JSON数据写入文件中保存(逆向):从文件中读出数据(正向). JSON ->Object-C(正向):jsondata->jso

protobuf,json,xml,binary,Thrift之间的对比

http://blog.csdn.net/angus_17/article/details/8493448 binary 二进制,数据流,也可以转化成 1100011类似的 protobuf 是google的,二进制的数据传输协议,性能比 xml 和 json 号. 但 可读性 差 Thrift 是 FackBook的,性能 比 protobuf还好 一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,总体看来ProtoBuf