Python 数据处理系列博客来啦!php
本系列将以《Python数据处理》这本书为基础,以书中每章一篇博客的形式带你们一块儿学习 Python 数据处理。书中有些地方讲的不太详细,我会查阅其余资料来补充,力争每篇博客都把知识点涵盖全且通俗易懂。python
这本书主要讲了如何用 Python 处理各类类型的文件,如 JSON、XML、CSV、Excel、PDF 等。后面几章还会讲数据清洗、网页抓取、自动化和规模化等使用技能。我也是 Python 初学者,将以初学者的角度写文章,因此博客对初学者比较友好。git
python 基础若是你还不熟练,能够先看看个人另外一篇博客:十分钟快速入门 Python程序员
100
多位经验丰富的开发者参与,在 Github 上得到了近1000
个star
的全栈全平台开源项目想了解或参与吗?
项目地址:github.com/cachecats/c…github
以易于机器理解的方式来存储数据的文件格式,一般被称做机器可读的 (machine readable)。常见的机器可读格式包括:json
在口语和书面语中,提到这些数据格式时一般使用它们的短名字(如 CSV)。 咱们将使用这些缩写 。小程序
CSV 文件(简称为 CSV)是指将数据列用逗号分隔的文件。文件的扩展名是 .csv。bash
另外一种数据类型,叫做制表符分隔值(tab-separated values,TSV)数据,有时也与 CSV归为一类。TSV 与 CSV 惟一的不一样之处在于,数据列之间的分隔符是制表符(tab),而不是逗号。文件的扩展名一般是 .tsv,但有时也用 .csv 做为扩展名。从本质上来看,.tsv 文件与 .csv 文件在Python 中的做用是相同的。架构
咱们采用的数据源是从世界卫生组织(www.who.int/zh/home)中下载…app
打开世卫组织官网后,点击“健康主题”,“数据和统计” 就能找到不少数据。
这里下载了关于婴幼儿护理的统计数据,并重命名为 data.csv
。
csv 文件能够直接用 Excel 打开直观的看到,咱们用 Excel 打开以下图:
接下来就要用 Python 来简单的处理这些数据。
编写一个读取 csv 文件的程序:
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
import csv
csvfile = open('./data.csv', 'r')
reader = csv.DictReader(csvfile)
for row in reader:
print(row)
复制代码
控制台输出:
一样在世卫组织官网下载数据源,重命名为 data.json
。用格式化工具打开 json
文件以下:
编写程序对 json 进行解析
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的编解码过程当中,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 |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
XML 格式的数据既便于机器读取,也便于人工读取。可是对于本章的数据集来讲,预览并理解 CSV 文件和 JSON 文件要比 XML 文件容易得多。
xml 格式说明:
世卫组织的数据很差理解,我们用个简单的能看得懂的电影数据来作演示:
<?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 格式的数据输出:
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 = {}
# 取出 type 标签的值
movie_type = movie.find('type')
attr_data['type'] = movie_type.text
# 取出 format 标签的值
movie_format = movie.find('format')
attr_data['format'] = movie_format.text
# 取出 year 标签的值
movie_year = movie.find('year')
if movie_year:
attr_data['year'] = movie_year.text
# 取出 rating 标签的值
movie_rating = movie.find('rating')
attr_data['rating'] = movie_rating.text
# 取出 stars 标签的值
movie_stars = movie.find('stars')
attr_data['stars'] = movie_stars.text
# 取出 description 标签的值
movie_description = movie.find('description')
attr_data['description'] = movie_description.text
# 获取电影名字,以电影名为字典的键,属性信息为字典的值
movie_title = movie.attrib.get('title')
movie_data[movie_title] = attr_data
# 存入列表中
all_data.append(movie_data)
print(all_data)
# all_data 此时是一个列表对象,用 json.dumps() 将python对象转换为 json 字符串
json_str = json.dumps(all_data)
print(json_str)
复制代码
注释写的比较详细,下面介绍下 ElementTree
提供的方法。
ElementTree
解析 xml 有三种方法:
调用parse()方法,返回解析树
tree = ET.parse('./resource/movie.xml')
root = tree.getroot()
复制代码
调用from_string(),返回解析树的根元素
data = open('./resource/movie.xml').read()
root = ET.fromstring(data)
复制代码
调用 ElementTree 类的 ElementTree(self, element=None, file=None)
方法
tree = ET.ElementTree(file="./resource/movie.xml")
root = tree.getroot()
复制代码
class xml.etree.ElementTree.Element(tag, attrib={}, **extra)
clear()
:清除全部子元素和全部属性,并将文本和尾部属性设置为None。
get(attribute_name, default=None)
:经过指定属性名获取属性值。
items()
:以键值对的形式返回元素属性。
keys()
:以列表的方式返回元素名。
set(attribute_name,attribute_value)
:在某标签中设置属性和属性值。
append(subelement)
:将元素子元素添加到元素的子元素内部列表的末尾。
extend(subelements)
:追加子元素。
find(match, namespaces=None)
:找到第一个匹配的子元素,match能够是标签名或者path。返回Elememt实例或None。
findall(match, namespaces=None)
:找到全部匹配的子元素,返回的是一个元素列表。
findtext(match, default=None, namespaces=None)
:找到匹配第一个子元素的文本。返回的是匹配元素中的文本内容。
getchildren()
:Python3.2后使用 list(elem)
或 iteration.
getiterator(tag=None)
:Python3.2后使用 Element.iter()
iter(tag=None)
:以当前元素为根建立树迭代器。迭代器遍历这个元素和它下面的全部元素(深度优先级)。若是标签不是None或’*’,那么只有标签等于标签的元素才会从迭代器返回。若是在迭代过程当中修改树结构,则结果是未定义的。
iterfind(match, namespaces=None)
: 匹配知足条件的子元素,返回元素。
class xml.etree.ElementTree.ElementTree(element=None, file=None)
ElementTree是一个包装器类,这个类表示一个完整的元素层次结构,并为标准XML的序列化添加了一些额外的支持。
setroot(element)
:替换根元素,原来的根元素中的内容会消失。
find(match, namespaces=None)
:从根元素开始匹配和 Element.find()做用同样。
findall(match, namespaces=None)
:从根元素开始匹配和 Element.findall()做用同样。
findtext(match, default=None, namespaces=None)
:从根元素开始匹配和 Element.findtext()做用同样。
getiterator(tag=None)
:Python3.2后使用 ElementTree.iter() 代替。
iter(tag=None)
:迭代全部元素
iterfind(match, namespaces=None)
:从根元素开始匹配和 Element.iterfind()做用同样。
parse(source, parser=None)
:解析xml文本,返回根元素。
write(file, encoding=”us-ascii”, xml_declaration=None, default_namespace=None, method=”xml”, *, short_empty_elements=True)
:写出XML文本。
对 JSON、XML、CSV三种格式数据的处理就讲完啦,下期讲如何处理 Excel 文件,欢迎关注。
CodeRiver 是一个免费的项目协做平台,愿景是打通 IT 产业上下游,不管你是产品经理、设计师、程序员或是测试,仍是其余行业人员,只要有好的创意、想法,均可以来 CodeRiver 免费发布项目,召集志同道合的队友一块儿将梦想变为现实!
CodeRiver 自己仍是一个大型开源项目,致力于打造全栈全平台企业级精品开源项目。涵盖了 React、Vue、Angular、小程序、ReactNative、Android、Flutter、Java、Node 等几乎全部主流技术栈,主打代码质量。
目前已经有近 100
名优秀开发者参与,github 上的 star
数量将近 1000
个。每一个技术栈都有多位经验丰富的大佬坐镇,更有两位架构师指导项目架构。不管你想学什么语言处于什么技术水平,相信都能在这里学有所获。
经过 高质量源码 + 博客 + 视频
,帮助每一位开发者快速成长。
您的鼓励是咱们前行最大的动力,欢迎点赞,欢迎送小星星✨ ~