文档章节

Python学习-结构化的文本文件

 子易乐
发布于 2017/03/29 20:51
字数 1209
阅读 29
收藏 1

结构化的文本文件

结构化的文本有很多格式,区别它们的方法如下: 分隔符, 比如tab(‘\t’)、逗号(‘,’)或竖线(‘|’)。 如:逗号分隔值(csv) ‘<’和’>’标签, 如XML 和 HTML 标点符号, 如 JavaScript Object Notation (JSON)。 缩进 如:YAML (即:YAML Ain’t Markup Language的缩写) 混合的,例如各种配置文件

CSV

带分隔符的文件一般用作数据交换格式或数据库。

>>> import csv
>>> villains = [
    ['Doctor','No'],
    ['Rosa','klebb'],
    ['Mister','Big'],
    ['Auric','Goldfinger'],
    ['Ernst','Blofeld'],]
>>> with open('villains','wt') as fout:  # 一个上下文管理器
    csvout = csv.writer(fout)
    csvout.writerows(villains)

>>> villains
[['Doctor', 'No'], ['Rosa', 'klebb'], ['Mister', 'Big'], ['Auric', 'Goldfinger'], ['Ernst', 'Blofeld']]

XML

带分隔符的文件仅有两维的数据:行和列,XML是最突出的处理这种转换的标记(markup)格式,它使用标签(tag)分隔数据。

XML通常用于数据传送和消息,它存在一些格式如:RSS和Atom,工业界有许多定制化的XML格式,例如:金融领域(http://www.service-architecture.com/articles/xml/finance_xml.html)

示例文件:menu.xml

<?xml version=”1.0”?>
<menu>
    <breakfast hours=”7-11”>
        <item price=”$6.00”>breakfast burritor</item>
        <item price=”$4.00”>pancakes</item>
    </breakfast>
<lunch hours=”11-3”>
        <item price=”$5.00”>hamburger</item>
</lunch>
    <dinner hours=”3-10”>
        <item price=”8.00”>spaghetti</item>
    </dinner>
</menu>

在Python中解析XML最简单的方法是使用ElementTree,下面的代码用来解析menu.xml文件以及输出一些标签和属性:

>>> import xml.etree.ElementTree as et
>>> tree = et.ElementTree(file = ‘menu.xml’)
>>> root = tree.getroot()
>>> root.tag
‘menu’
>>> for child in root:
    print('tag:',child.tag,'attributes:',child.attrib)
    for grandchild in child:
        print('\tag:',grandchild.tag,'attributes:',grandchild.attrib)

tag: breakfast attributes: {'hours': '7-11'}
    ag: item attributes: {'price': '$6.00'}
    ag: item attributes: {'price': '$4.00'}
tag: lunch attributes: {'hours': '11-3'}
    ag: item attributes: {'price': '$5.00'}
tag: dinner attributes: {'hours': '3-10'}
    ag: item attributes: {'price': '8.00'}
>>> len(root)  #菜单选择的数目
3
>>> len(root[0])  #早餐项的数目
2

对于嵌套列表中的每一个元素,tag是标签字符串,attrib是它属性的一个字典。ElementTree有许多查找XML导出数据、修改数据乃至写入XML文件的方法,他的文档(https://docs.python.org/3.3/library/xml.etree.elementtree.html)中有详细介绍。

其他标准的Python XML库如下: xml.dom :JavaScript开发者比较熟悉的文档对象模型(DOM),将Web文档表示成层次结构,它会把整个XML文件载入到内存中,同样允许你获取所有的内容。

xml.sax : 简单的XML API 或者SAX都是通过在线解析XML,不需要一次载入所有内容到内存中,因此对于处理巨大的XML文件流是一个很好的选择。

HTML

更多用HTML来格式化输出显示结果而不是用于交换数据

JSON

JavaScript Object Notation(JSON,http://www.json.org)是源于JavaScript的当今很流行的数据交换格式,它是JavaScript语言的一个子集,也是Python合法可支持的语法。 Python只有一个主要的JSON模块json。

实例:以之前XML例子构件JSON的数据结构,再把JSON字符串解码成数据。

>>> menu = \
    {
    "breakfast":{
            "hours":"7-11",
            "items":{
                    "breakfast burritos":"$6.00",
                    "pancakes":"$4.00"
                    }
             },
    "lunch":{
            "hours":"11-3",
            "items":{
                    "hamburger":"$5.00"
                    }
            },
    "dinner":{
            "hours":"3-10",
            "items":{
                   "spaghetti":"$8.00"
                   }
            }
     }
>>> 

使用dumps()将menu编码成JSON字符串

>>> import json
>>> menu_json = json.dumps(menu)
>>> menu_json
'{"breakfast": {"hours": "7-11", "items": {"breakfast burritos": "$6.00", "pancakes": "$4.00"}}, "lunch": {"hours": "11-3", "items": {"hamburger": "$5.00"}}, "dinner": {"hours": "3-10", "items": {"spaghetti": "$8.00"}}}'
>>> 

使用load()把JSON字符串menu_json解析成Python的数据结构

>>> menu2 = json.loads(menu_json)
>>> menu2
{'breakfast': {'hours': '7-11', 'items': {'breakfast burritos': '$6.00', 'pancakes': '$4.00'}}, 'lunch': {'hours': '11-3', 'items': {'hamburger': '$5.00'}}, 'dinner': {'hours': '3-10', 'items': {'spaghetti': '$8.00'}}}
>>> 

menu和menu2是具有相同键值的字典

YAML

yaml同样有键和值,但主要用来处理日期和时间,标准的Python库没有处理YAML的模块,因此需要安装第三方yaml操作数据,load()将YAML字符串转换为Python数据结构,而dump()正好相反。

配置文件

使用标准configparser模块处理Windows风格的初始化.ini文件,这些文件都包含key=value的定义,修改等自定义操作也可实现,请参阅configparser(https://docs.python.org/3.3/library/configparser.html).如果需要两层以上的嵌套结构,使用YAML或者JSON。

下面是一个简单的配置文件settings.cfg例子:

[english]
greeting = Hell
[french]
greeting = Bonjour
[files]
home = /usr/local

简单的插入:

bin = %(home)s/bin

>>> 
>>> import configparser
>>> cfg = configparser.ConfigParser()
>>> cfg.read('settings.cfg')
['settings.cfg']
>>> cfg
<configparser.ConfigParser object at 0x014112D0>
>>> cfg['french']
<Section: french>
>>> cfg['french']['greeting']
'Bonjour'
>>> cfg['files']['bin']
'/usr/local/bin'
>>>

其他交换格式

以下的二进制数据交换格式通常比XML或者JSON更加快速和复杂:

MsgPack(http://msgpack.org)

Protocol Buffers(https://code.google.com/p/protobuf/)

Avro(http://avro.apache.org/docs/current/)

Thrift(http://thrift.apache.org/)

使用pickle序列化

存储数据结构到一个文件中也称为序列化(serializing).Python提供了pickle模块以特殊的二进制格式保存和恢复数据对象。使用函数dump()序列化数据岛文件,而函数load()用作反序列化。

>>> 
>>> import pickle
>>> import datetime
>>> 
>>> now1 = datetime.datetime.utcnow()
>>> pickled = pickle.dumps(now1)
>>> now2 = pickle.loads(pickled)
>>> now1
datetime.datetime(2017, 3, 25, 3, 16, 49, 282762)
>>> now2
datetime.datetime(2017, 3, 25, 3, 16, 49, 282762)
>>>

© 著作权归作者所有

粉丝 0
博文 17
码字总数 18498
作品 0
西安
私信 提问
数据分析:基于Python的自定义文件格式转换系统

数据分析:基于Python的自定义文件格式转换系统 (白宁超 2018年7月16日14:47:41 ) 导读:随着大数据的快速发展,自然语言处理、数据挖掘、机器学习技术应用愈加广泛。针对大数据的预处理工作...

伏草惟存
2018/07/18
0
0
Java软件开发者,如何学习大数据?(了解一下)大数据的前世今生

Java软件开发者,如何学习大数据? 最近有不少初学者来问到,学习大数据,学习spark,公司主要使用那些语言编写,每听到这一个问题,起码还是很不错的,证明你已经开始学习大数据了,并了解大...

董黎明
2018/06/05
0
0
CCAI2018 | 大规模文本数据挖掘的新方向

现实中的大数据常常表示为一种非结构化,交叉和动态变化的文本数据。如何从大规模文本数据中抽取结构化知识是一个非常值得研究的任务。很多研究工作依赖于劳动密集型的数据标注,用有监督的方...

技术小能手
2018/06/25
0
0
【Python爬虫】第三周练习(14)

一、div标签文本提取 将学习视频中xpath.html文件中div标签下文本值 “第一个div” ,“第二个div” 使用xpath结构化提取并打印输出 二、ul标签文本提取 将xpath.html文件中ul标签下“流程”...

Doggy米
2018/01/12
0
0
Protocol Buffers 2.6.0 发布

Protobuf 2.6.0 发布,此版本现已提供下载,更新内容如下: 常规更新 添加 oneofs(unions) 功能。Fields in the same oneof will share memory and at most one field can be set at the sa...

oschina
2014/09/27
6.1K
4

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
5
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
5
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
7
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部