Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python数据处理(一):处理 JSON、XML、CSV 三种格式数据

Python数据处理(一):处理 JSON、XML、CSV 三种格式数据

作者头像
solocoder
发布于 2022-04-06 05:28:29
发布于 2022-04-06 05:28:29
3.9K05
代码可运行
举报
文章被收录于专栏:大前端客栈大前端客栈
运行总次数:5
代码可运行

Python 数据处理系列博客来啦!

本系列将以《Python数据处理》这本书为基础,以书中每章一篇博客的形式带大家一起学习 Python 数据处理。书中有些地方讲的不太详细,我会查阅其他资料来补充,力争每篇博客都把知识点涵盖全且通俗易懂。

这本书主要讲了如何用 Python 处理各种类型的文件,如 JSONXML、CSV、Excel、PDF 等。后面几章还会讲数据清洗、网页抓取、自动化和规模化等使用技能。我也是 Python 初学者,将以初学者的角度写文章,所以博客对初学者比较友好。

python 基础如果你还不熟练,可以先看看我的另一篇博客:十分钟快速入门 Python

100 多位经验丰富的开发者参与,在 Github 上获得了近 1000star 的全栈全平台开源项目想了解或参与吗? 项目地址:https://github.com/cachecats/coderiver

前言

以易于机器理解的方式来存储数据的文件格式,通常被称作机器可读的 (machine readable)。常见的机器可读格式包括:

  • 逗号分隔值(Comma-Separated Values,CSV)
  • JavaScript 对象符号(JavaScript Object Notation,JSON)
  • 可扩展标记语言(eXtensible Markup Language,XML)

在口语和书面语中,提到这些数据格式时通常使用它们的短名字(如 CSV)。 我们将使用这些缩写 。

一、CSV数据

CSV 文件(简称为 CSV)是指将数据列用逗号分隔的文件。文件的扩展名是 .csv。

另一种数据类型,叫作制表符分隔值(tab-separated values,TSV)数据,有时也与 CSV归为一类。TSV 与 CSV 唯一的不同之处在于,数据列之间的分隔符是制表符(tab),而不是逗号。文件的扩展名通常是 .tsv,但有时也用 .csv 作为扩展名。从本质上来看,.tsv 文件与 .csv 文件在Python 中的作用是相同的。

我们采用的数据源是从世界卫生组织(https://www.who.int/zh/home)中下载的数据。

打开世卫组织官网后,点击“健康主题”,“数据和统计” 就能找到很多数据。

这里下载了关于婴幼儿护理的统计数据,并重命名为 data.csv

csv 文件可以直接用 Excel 打开直观的看到,我们用 Excel 打开如下图:

接下来就要用 Python 来简单的处理这些数据。

以列表的形式读取csv数据

编写一个读取 csv 文件的程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import csv

csvfile = open('./data.csv', 'r')
reader = csv.reader(csvfile)
for row in reader:
    print(row)

import csv 将导入 Python 自带的 csv 模块。csvfile = open('./data.csv', 'r') 以只读的形式打开数据文件并存储到变量 csvfile 中。然后调用 csv 的 reader() 方法将输出保存在 reader 变量中,再用 for 循环将数据输出。

运行程序,控制台输出:

可以看到跟 Excel 打开的内容一致。

以字典的形式读取csv数据

改一下代码,以字典的形式读取 csv

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import csv

csvfile = open('./data.csv', 'r')
reader = csv.DictReader(csvfile)
for row in reader:
    print(row)

控制台输出:

二、JSON数据

同样在世卫组织官网下载数据源,重命名为 data.json。用格式化工具打开 json 文件如下:

编写程序对 json 进行解析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import json

# 将 json 文件读取成字符串
json_data = open('./data.json').read()
# 对json数据解码
data = json.loads(json_data)
# data 的类型是 字典dict
print(type(data))
# 直接打印 data
print(data)
# 遍历字典
for k, v in data.items():
    print(k + ':' + str(v))

控制台输出:

Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:

  • json.dumps(): 对数据进行编码。
  • json.loads(): 对数据进行解码。

在json的编解码过程中,python 的原始类型与json类型会相互转换,具体的转化对照如下:

Python 编码为 JSON 类型转换对应表:

Python

JSON

dict

object

list, tuple

array

str

string

int, float, int- & float-derived Enums

number

True

true

False

false

None

null

JSON 解码为 Python 类型转换对应表:

JSON

Python

object

dict

array

list

string

str

number (int)

int

number (real)

float

true

True

false

False

null

None

三、XML 数据

XML 格式的数据既便于机器读取,也便于人工读取。但是对于本章的数据集来说,预览并理解 CSV 文件和 JSON 文件要比 XML 文件容易得多。

xml 格式说明:

  • Tag: 使用<和>包围的部分;
  • Element:被Tag包围的部分,如 2003,可以认为是一个节点,它可以有子节点;
  • Attribute:在Tag中可能存在的 name/value 对,如示例中的 title="Enemy Behind",一般表示属性。

世卫组织的数据不好理解,咱们用个简单的能看得懂的电影数据来做演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<collection shelf="New Arrivals">
    <movie title="Enemy Behind">
        <type>War, Thriller</type>
        <format>DVD</format>
        <year>2003</year>
        <rating>PG</rating>
        <stars>10</stars>
        <description>Talk about a US-Japan war</description>
    </movie>
    <movie title="Transformers">
        <type>Anime, Science Fiction</type>
        <format>DVD</format>
        <year>1989</year>
        <rating>R</rating>
        <stars>8</stars>
        <description>A schientific fiction</description>
    </movie>
    <movie title="Trigun">
        <type>Anime, Action</type>
        <format>DVD</format>
        <episodes>4</episodes>
        <rating>PG</rating>
        <stars>10</stars>
        <description>Vash the Stampede!</description>
    </movie>
    <movie title="Ishtar">
        <type>Comedy</type>
        <format>VHS</format>
        <rating>PG</rating>
        <stars>2</stars>
        <description>Viewable boredom</description>
    </movie>
</collection>

这个数据相对来说比较简单,只有三层。但原理掌握了,几层数据都能搞定。

下面编写代码对上面的 xml 进行解析,解析之后再分别格式化成字典和 json 格式的数据输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from xml.etree import ElementTree as ET
import json

tree = ET.parse('./resource/movie.xml')
root = tree.getroot()
all_data = []
for movie in root:
    # 存储电影数据的字典
    movie_data = {}
    # 存储属性的字典
    attr_data = {}
<span class="hljs-comment"># 取出 type 标签的值</span>
movie_type = movie.find(<span class="hljs-string">'type'</span>)
attr_data[<span class="hljs-string">'type'</span>] = movie_type.text

<span class="hljs-comment"># 取出 format 标签的值</span>
movie_format = movie.find(<span class="hljs-string">'format'</span>)
attr_data[<span class="hljs-string">'format'</span>] = movie_format.text

<span class="hljs-comment"># 取出 year 标签的值</span>
movie_year = movie.find(<span class="hljs-string">'year'</span>)
<span class="hljs-keyword">if</span> movie_year:
    attr_data[<span class="hljs-string">'year'</span>] = movie_year.text

<span class="hljs-comment"># 取出 rating 标签的值</span>
movie_rating = movie.find(<span class="hljs-string">'rating'</span>)
attr_data[<span class="hljs-string">'rating'</span>] = movie_rating.text

<span class="hljs-comment"># 取出 stars 标签的值</span>
movie_stars = movie.find(<span class="hljs-string">'stars'</span>)
attr_data[<span class="hljs-string">'stars'</span>] = movie_stars.text

<span class="hljs-comment"># 取出 description 标签的值</span>
movie_description = movie.find(<span class="hljs-string">'description'</span>)
attr_data[<span class="hljs-string">'description'</span>] = movie_description.text

<span class="hljs-comment"># 获取电影名字,以电影名为字典的键,属性信息为字典的值</span>
movie_title = movie.attrib.get(<span class="hljs-string">'title'</span>)
movie_data[movie_title] = attr_data
<span class="hljs-comment"># 存入列表中</span>
all_data.append(movie_data)

print(all_data)
# all_data 此时是一个列表对象,用 json.dumps() 将python对象转换为 json 字符串
json_str = json.dumps(all_data)
print(json_str)

注释写的比较详细,下面介绍下 ElementTree 提供的方法。

3.1 解析的三种方法

ElementTree 解析 xml 有三种方法:

3.2 Element 对象

class xml.etree.ElementTree.Element(tag, attrib={}, **extra)

Element 对象的属性

  • tag: 标签
  • text: 去除标签,获得标签中的内容。
  • attrib: 获取标签中的属性和属性值。
  • tail: 这个属性可以用来保存与元素相关联的附加数据。它的值通常是字符串,但可能是特定于应用程序的对象。

Element 对象的方法

  1. clear():清除所有子元素和所有属性,并将文本和尾部属性设置为None。
  2. get(attribute_name, default=None):通过指定属性名获取属性值。
  3. items():以键值对的形式返回元素属性。
  4. keys():以列表的方式返回元素名。
  5. set(attribute_name,attribute_value):在某标签中设置属性和属性值。
  6. append(subelement):将元素子元素添加到元素的子元素内部列表的末尾。
  7. extend(subelements):追加子元素。
  8. find(match, namespaces=None):找到第一个匹配的子元素,match可以是标签名或者path。返回Elememt实例或None。
  9. findall(match, namespaces=None):找到所有匹配的子元素,返回的是一个元素列表。
  10. findtext(match, default=None, namespaces=None):找到匹配第一个子元素的文本。返回的是匹配元素中的文本内容。
  11. getchildren():Python3.2后使用 list(elem) 或 iteration.
  12. getiterator(tag=None):Python3.2后使用 Element.iter()
  13. iter(tag=None):以当前元素为根创建树迭代器。迭代器遍历这个元素和它下面的所有元素(深度优先级)。如果标签不是None或’*’,那么只有标签等于标签的元素才会从迭代器返回。如果在迭代过程中修改树结构,则结果是未定义的。
  14. iterfind(match, namespaces=None): 匹配满足条件的子元素,返回元素。

3.3 ElementTree 对象

class xml.etree.ElementTree.ElementTree(element=None, file=None)

ElementTree是一个包装器类,这个类表示一个完整的元素层次结构,并为标准XML的序列化添加了一些额外的支持。

  1. setroot(element):替换根元素,原来的根元素中的内容会消失。
  2. find(match, namespaces=None):从根元素开始匹配和 Element.find()作用一样。
  3. findall(match, namespaces=None):从根元素开始匹配和 Element.findall()作用一样。
  4. findtext(match, default=None, namespaces=None):从根元素开始匹配和 Element.findtext()作用一样。
  5. getiterator(tag=None):Python3.2后使用 ElementTree.iter() 代替。
  6. iter(tag=None):迭代所有元素
  7. iterfind(match, namespaces=None):从根元素开始匹配和 Element.iterfind()作用一样。
  8. parse(source, parser=None):解析xml文本,返回根元素。
  9. write(file, encoding=”us-ascii”, xml_declaration=None, default_namespace=None, method=”xml”, *, short_empty_elements=True):写出XML文本。

对 JSON、XML、CSV三种格式数据的处理就讲完啦,下期讲如何处理 Excel 文件。

项目地址:https://github.com/cachecats/coderiver

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/01/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python数据处理(一):处理 JSON、XML、CSV 三种格式数据
本系列将以《Python数据处理》这本书为基础,以书中每章一篇博客的形式带大家一起学习 Python 数据处理。书中有些地方讲的不太详细,我会查阅其他资料来补充,力争每篇博客都把知识点涵盖全且通俗易懂。
程序员鑫港
2021/12/30
4.2K0
【Python爬虫五十个小案例】爬取豆瓣电影Top250
文章链接:https://cloud.tencent.com/developer/article/2470420
小馒头学Python
2024/11/25
9410
【Python爬虫五十个小案例】爬取豆瓣电影Top250
【说站】python XML数据是什么
Element:被Tag包围的部分,如 2003,可以认为是一个节点,它可以有子节点;
很酷的站长
2022/11/23
2210
【说站】python XML数据是什么
10-angular 实例学习-1
controller 和 ng-options CSDN 链接 1.demo: <div ng-app="myApp" ng-init="number=1;cost=1" ng-controller="myCtr" class="wrapper"> <div class="money"> numebr: <input type="number" ng-model="number" name="" min="0" id="">
西南_张家辉
2021/02/02
5410
【译】JavaScript实现文字剪贴板&React版本
目录 怎么使用JavaScript实现一个剪贴 上面的方法不是很完美我们优化一下 思考一个问题 使用react和typescript重写和优化一下 如何使用copyme 原文参考 写在最前面 有一
西南_张家辉
2021/02/02
5490
模板过滤器
过滤器是通过管道符号(|)进行使用的,例如:{{ name|length }},将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中
星哥玩云
2022/09/14
2690
react es6+ 代码优化之路-1
这里集合了一些代码优化的小技巧 在初步接触 es6+ 和 react 的时候总结的一些让代码跟加简化和可读性更高的写法 大部分知识点是自己在平时项目中还不知道总结的,一致的很多优化的点没有写出来,逐步增加中,目的是使用最少的代码,高效的解决问题 有什么更好的方法和不足之处,欢迎大家指出。 react es6+ 代码优化之路-1 1、函数式默认参数 使用函数默认的参数, 使用 es6+ 的时候,有了结构赋值,我们就不用再函数中自己再去定义一个变量。 /* 当我们使用 es5 的时候 **/ var e
西南_张家辉
2021/02/02
2820
技术 | Python从零开始系列连载(二十九)
为了解答大家学习Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极学习转载~
灯塔大数据
2018/12/14
3350
Android原生同步登录状态到H5网页避免二次登录
本文解决的问题是目前流行的 Android/IOS 原生应用内嵌 WebView 网页时,原生与H5页面登录状态的同步。
solocoder
2022/04/06
1.6K0
SpringBoot 企业微信点餐系统实战三:商品信息及买家商品api开发
按照数据库的字段写出对应的实体类 ProductInfo。@Data 是 lombok 的注解,用于自动生成 getter, setter, toString 方法,不懂的可以自行查询相关资料。
solocoder
2022/04/06
6960
SpringBoot 企业微信点餐系统实战三:商品信息及买家商品api开发
Python操作xml
Xml XML指可扩展标记语言(Extensible Markup Language) XML被设计用于结构化、存储和传输数据 XML是一种标记语言,很类似于HTML XML没有像HTML那样具有预定义标签,需要程序员自定义标签。 XML被设计为具有自我描述性,并且是W3C的标准 XML元素 XML的元素是指从开始标签直到结束标签的部分(均包括开始结束)。 一个元素可以包含: 1、其他元素 2、文本 3、属性 4、或混合以上所有 XML语法规则 所有的XML元素都必须有一个开始标签和结束标签,
py3study
2020/01/10
2.4K0
[Vuejs]手把手教你创建递归树组件(附完整demo)
可以把文件目录理解成树(Tree),目录就是树的节点(Node)。树总是有一个根节点,从根节点上进行某一操作,找到子节点,重复同一操作,直到叶子节点(没有子节点的节点)。
用户2845596
2021/01/21
6990
Python爬取《赘婿》弹幕
在近期的工作代码中我遇到了一些小问题,导致了我的更新慢了不少。今天我就想把我在之前遇到的问题分享给大家,并通过一篇实战内容来教会大家,希望各位小伙伴以后遇到类似问题的时候,可以想起我的文章,并解决问题。
程序员迪迪
2021/12/23
6230
【测试开发】python系列教程:xml 模块
XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
雷子
2023/08/25
2540
【测试开发】python系列教程:xml 模块
重拾安卓:自定义View之表格封装实现
因业务需要又要做一个 Android 原生的项目,记录下时隔几年之后再开发安卓的那些事。讲的不会太基础,基本上是自定义View封装,复杂功能的实现等等,有需要的小伙伴可以关注~
solocoder
2022/04/06
9420
重拾安卓:自定义View之表格封装实现
MyBatis 与 SpringBoot 整合:注解和xml两种使用方式介绍
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
solocoder
2022/04/06
1.4K0
后台管理-xadmin
在Python终端输入命令help(‘xadmin’) 查看xadmin安装位置 得到如下输出
星哥玩云
2022/09/14
6.5K0
后台管理-xadmin
数据库模型关系
使用OneToOneField创建1对1的模型关系 将要创建对应关系的模型添加OneToOneField
星哥玩云
2022/09/14
2.8K0
Groovy-12.XML
Groovy提供了XML语言的支持,主要通过两个类(构建和解析): XML标记构建器 - Groovy支持基于树的标记生成器BuilderSupport,它可以被子类化以生成各种树结构对象表示。通常,这些构建器用于表示XML标记,HTML标记。 Groovy的标记生成器捕获对伪方法的调用,并将它们转换为树结构的元素或节点。这些伪方法的参数被视为节点的属性。作为方法调用一部分的闭包被视为生成的树节点的嵌套子内容。 XML解析器 - Groovy XmlParser类使用一个简单的模型来将XML文档解析为Nod
悠扬前奏
2019/05/30
5570
Python 读取配置文件常用几种方式
  我们在设计自动化测试框架的时候,经常使用到配置文件,而配置文件种类有很多,常见的配置文件格式有很多中:ini、yaml、xml、properties、txt、py等。
全栈测试开发日记
2023/02/02
2K0
Python 读取配置文件常用几种方式
相关推荐
Python数据处理(一):处理 JSON、XML、CSV 三种格式数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验