Python全栈数据工程师养成攻略(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-20 12:42:12

点击下载

作者:张宏伦

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python全栈数据工程师养成攻略

Python全栈数据工程师养成攻略试读:

前言

随着数据时代的到来,越来越多的人对如何使用数据和挖掘数据价值产生了浓厚兴趣和迫切需求。他们来自于互联网、公共服务、新闻、法律、医疗、设计等不同行业,正在不断地接触和使用日益增长的数据。掌握如何进行数据获取、存储、分析和可视化等技术,对他们当下的工作和未来的发展都能起到重要的作用。

我是一名数据爱好者,乐于不断学习,喜欢挑战自己。在参加了多项数据领域的大型赛事之后,萌生了将自己的经历和经验进行整理总结,并分享给其他广大数据爱好者的想法。我希望这份总结基于理论但不囿于理论,以数据为核心并涵盖尽可能多的领域,注重实战项目和编程能力,帮助对数据感兴趣却不知从何下手的读者概览各方面内容,快速理解掌握相关技能,有所收获并动手实践起来,先全面了解,再深入钻研。序言 暖个场子

Python是一门简单易学、功能强大的编程语言,在数据领域中也提供了丰富而完善的支持,可以非常方便地完成各种和数据相关的任务,如处理图片、文本和音频,以及实现经典的机器学习和深度学习模型等。因此本书将以Python为主,结合其他多门编程语言,从数据的获取、存储、分析和可视化等方面,全面讲解如何实现一些小而美的数据应用,让每个人都可以独立自主地达成一些数据成就。

本书首先介绍了替读者预热的准备内容。第1章讨论数据工程的概念和各种编程语言的特点,带领读者在个人计算机上搭建好 Python 编程环境,并概览了日常生活中数据的组织结构和常见类型。第2章介绍Python中最为核心和常用的语法,使得即便是之前没有接触过编程的新手,也能快速掌握Python的使用方法,通过Python完成一些简单的任务,如处理文本数据并进行词频统计。

第3章介绍网络爬虫的背景知识和实现原理,以及如何使用Python编写简单的爬虫,读者可以根据个人兴趣,从各大门户网站上获取需要的数据。第4章介绍如何在个人电脑上搭建Web环境,并以关系型数据库中的MySQL为例,讨论如何进行数据的存储,使读者可以更好、更方便地存储和管理获取到的数据。

第5章介绍另一门简单而强大的编程语言——R语言,并讨论如何在R语言中使用ggplot2绘制条形图、折线图、散点图等静态可视化图形,从而更直观地展示从数据中得到的结论。第6章介绍日常生活中最为常见和重要的文本数据以及与自然语言理解相关的研究和应用,如何通过Python中的jieba分词完成中文文本的分词、关键词提取、词性标注等任务,还介绍了词嵌入的概念以及如何训练蕴含语义的词向量。

交互网站是数据可视化的一种重要形式,因此第7章介绍HTML、CSS、JavaScript等前端基础。第8章则介绍一些Web进阶内容,包括基于JavaScript的前端框架JQuery,以及如何使用ThinkPHP和Flask等后端框架实现一个涉及数据库操作的简易个人博客,使读者可以根据个人需求独立设计和完成兼具前后端的网站。第9章介绍ECharts、D3、Processing等可视化工具的使用,通过交互网站和视频等形式实现数据的更加丰富多样的动态可视化,让读者更好地感受数据的魅力。

接下来的两章选取了机器学习和深度学习两大热门领域的核心内容,为读者进一步实现数据价值的深度分析和挖掘打下坚实基础。第10章介绍机器学习的基本概念、常用的经典模型及其实现,并讨论了XGBoost模型的训练和调参技巧。第11章介绍深度学习的基本概念、CNN和RNN等神经网络的核心思想和应用场景,并以手写数字识别模型为例,介绍如何使用Python中的Keras实现深度学习模型的定义和训练。

第12章介绍如何通过一个好的故事,将自己的数据成果分享和展示给他人,以及如何制作有内容、有颜值的PPT,使读者在提升自我各方面技术能力的同时,能够有意识地培养和锻炼自己的演讲和交流能力。

在编写本书时,我的妻子、亲人和好友给予了很多帮助,在此非常感谢你们的支持。

希望拿到这本书的每个人,都能感受数据之美,并通过挖掘数据价值,爱上数据。

由于作者水平有限,书中难免存在一些错误或不准确的地方,恳请各位读者不吝斧正。相关意见和建议可以通过知乎“张宏伦”、微信公众号“宏伦工作室”进行反馈,也可以向邮箱zhanghonglun@sjtu.edu.cn发送邮件,期待收到各位读者宝贵的意见和建议。书中全部视频也可通过网易云课堂观看。扫描关注微信公众号扫描访问网易云课堂配套课程第1章 写在前面1.1 数据工程和编程语言数据工程和编程语言

近年来大数据(BigData)的概念火得不行,之前流行的互联网+,换成大数据+后又成就了一大批创业公司。政府部门对大数据战略部署同样重视,各种大数据产业园和科技区如雨后春笋般火热发展。很多不同行业的人言必称大数据,时常把大数据时代的4个 V 和3种思维[1]挂在嘴边,但他们心里所说的和实际所做的,大多只是大数据领域上层应用中的一个子集,即基于数据做一些统计、分析和展示,甚至很多时候数据并不满足“大”的特征。

当然,这本书的目的并不是探讨大数据的知识体系和技术架构,而是从个人角度出发,介绍如何在时间有限(可能你并不是大数据领域的专业从事人员)和资源有限(可能你只有一台笔记本电脑可以运行程序)的条件下,实现一些个人能力足以完成的、简单而有趣的数据工程和数据应用。这本书的读者可能已经具备一定的编程基础,也有可能之前未曾接触过任何代码,在经过恰当的学习和足够的练习之后,都可以拿出自己的笔记本电脑,独立实现让人惊艳的数据成果和作品。1.1.1 如何玩转数据

在进行一项数据工程之前,首先需要考虑并解决一些问题,想清楚这些问题的答案比直接撸起袖子写代码更为重要。1.获取

我们的数据从何而来?巧妇难为无米之炊,如果希望做出有价值、有意义的成果,所用数据的数量和质量都应得到保证。理想情况下自然是别人准备好数据提供给我们,但现实情况往往是需要我们自己去获取。如果不具备大规模部署传感器和海量用户上传数据等采集数据的能力,那么通过爬虫从已有网站上获取结构化数据则是唯一的解决途径。因此需要考虑并解决的问题包括以下几点,我需要哪方面的数据?哪些网站已经具备了这些数据?我需要从这些网站分别采集哪些数据?多大的数据量才能满足我的需求?数据是一次获取即可,还是需要持续更新?如果需要持续更新,应当达到怎样的更新频率?2.存储

我们需要把获取的数据存储下来,以便进一步使用。不同的数据量和数据类型,可能适合于不同的存储方案。对于数据量较少、后续处理较简单的情况,可以将数据存储到静态文件中,如 txt、csv、json 等格式文件。这种方法读写都十分方便,并且易于数据的复制和共享。对于数据量较大、后续处理较复杂的情况,可以将数据存储到一些通用而且成熟的开源数据库中,如MySQL、PostgreSQL等关系型数据库,以及MongoDB、Neo4j等非关系型数据库(NoSQL)。这种方法更为稳定且易于维护,支持数据的 Create、Update、Read、Delete等后续操作。如果有部署 Web 网站应用的需求,那么将数据库作为后端数据存储则是更好的选择。因此需要考虑并解决的问题包括:我有多大数据量需要存储?后续处理是否复杂?数据是否会持续更新?我应该选择哪种数据存储方案?3.分析

在经过必要的清洗工作之后,我们希望从数据中挖掘出感兴趣的价值和结论。一方面可以进行一些简单的计算汇总工作,从不同维度聚合出对应的结果;另一方面也可以从统计学或机器学习的角度出发,分析数据不同字段之间的关联,同时训练一些分类或聚类[2]的模型,用以解决实际应用问题。不同类型的数据,如文本、数值和类别值等,所涉及的数据分析方法可能完全不同。因此需要考虑并解决的问题包括:我的数据属于何种类型?我希望从数据中挖掘出哪些价值?我希望通过数据完成哪些任务?我应当选择哪些分析技术和算法模型?4.可视化

用数据可视化的方法表达和展示所得结论。正所谓一图胜千言,枯燥的数据和苍白的语言也许并不足以承载数据的价值,而借助图形、色彩、布局等视觉元素则能更生动、更丰富、更全面地诠释数据的灵魂。我们既可以使用散点图、折线图、柱状图等经典图形,也可以大开脑洞去尝试一些天马行空的表达形式,充分探索组织图形、色彩和布局等内容的可能性。因此需要考虑并解决的问题包括:我需要展示哪些数据和结论?哪种图形和表现形式最能满足我的需求?可视化是选择静态图片、交互网站,还是动态视频?

如果以上4个步骤的问题都已经想清楚,那么恭喜你,可以按照你的想法开始玩转数据了。通过获取、存储、分析和可视化,将原始数据逐步提升为信息、知识和价值,这便是玩转数据最大的魅力和乐趣所在。1.1.2 关于编程语言

哪种编程语言最好,最适合做数据工程?如果真要讨论起来,这将是一个永远没有结论的哲学问题。既然无法给这个问题一个合适的答案,不如将单选题变为多选题,毕竟只学习一门语言可能远远不够。以全栈数据工程师为目标,我们应当各方面内容都有所涉足,同时具备自己最为擅长和习惯使用的一至两门语言。

C++和 Java 这两门语言最好熟悉其一,从而了解编程语法的基本内容和面向对象的编程思想。熟悉的要求是指不用完全掌握和精通,在需要用到的时候查一查,能够快速回想起相关内容即可。很多人会发现,掌握一门语言之后,再去学其他语言便能很快上手,因为不同语言之间的编程思想都是基本相通的。

Python 是一门简单好用而且功能强大的语言,也是笔者使用最多、最为熟悉的一门语言。Python 的强大之处在于其具备极为丰富的功能包,从前端到后端,从软件到硬件,从机器学习到自然语言理解,几乎无所不包、全栈通吃。同时对语法的约束和限制也没有 C++、Java 那样严格,因此非常适合新手学习。有一句经典的玩笑话,“Python 大法好,除了炒菜别的都可以干”。

R 是一门统计分析语言,和 Python 类似,具有数量众多且功能强大的包,以及庞大而活跃的用户社区。近年来 R 的学习门槛和成本都在不断降低,可以用于进行专业的统计分析和图形绘制,极力推荐同时掌握Python和R。

除此之外,还有和 Web 网站开发相关的一些语言,如前端的 HTML、CSS 和JavaScript,后端的 PHP、NodeJS 等。在这些语言的基础上还衍生出了丰富的封装和框架[3],便于用户更快、更好地进行开发。就像 Python 的功能包难以全部掌握一样,和 Web 网站开发相关的封装和框架更是难以全部熟悉。

笔者个人习惯于使用Python获取数据并写入文件或数据库中,结合Python和R进行数据分析和挖掘。至于数据可视化部分,则使用R绘制静态图形,基于Web网站实现动态交互可视化。

本书的后续章节将以 Python 为主,完整地介绍如何进行数据的获取、存储、分析和可视化,以个人能力独立完成一些有趣的事情。1.2 带好装备——Python和Sublime带好装备Python和Sublim

在正式撸起袖子开始写代码之前,需要做好一些准备工作。对我们而言,最为重要的两件装备,便是编程语言和编辑器。1.2.1 Python

Python 是一门语法简单但功能强大的编程语言,也是笔者使用最多、最为熟悉的一门语言。Python中有很多方便好用的功能包,使用这些包,可以用Python来做很多有意思的事情。1.下载和安装

在 Mac 和 Linux 操作系统上一般会默认自带 Python,Windows 上如果没有的话,可以访问地址(https://www.python.org/),下载并安装 Python。当然,除了手动安装 Python之外,更推荐使用下面将会介绍到的Anaconda。

Python的主流版本有2.7和3.5两种,语法和内容上存在很多不同。虽然3.5更新一些,但3.5对2.7向下并不兼容,很多在2.7中可以使用的包,在3.5中无法正常运行,因此2.7完全过渡到3.5仍需要一段时间。现阶段推荐使用2.7版本,熟练掌握2.7的用法,即使若干年后再切换至成熟之后的3.5版本,也并非难事。2.pip

pip是Python的包管理工具,有了pip之后,安装或者删除某个Python包,如用于数值计算的 numpy,只需要在系统命令行[4]中输入 pip install numpy 或 pip uninstall numpy 即可,而不用费力去网上查找和下载。

以下文章链接提供了在 Windows 或 Mac 上安装 pip 的操作过程。当然,除了手动安装pip之外,更推荐使用下面将会介绍到的Anaconda。

Windows,(http://www.tuicool.com/articles/eiM3Er3/)

Mac,(http://www.xuebuyuan.com/593678.html)3.Anaconda

除了手动安装Python和pip之外,更好、更方便的选择是安装一个类似Anaconda这样的编程组合套餐。Anaconda包含了Python和一些常用的包,以及用于管理包的pip,这意味着只要安装了 Anaconda,我们所需的软件就一气呵成地全部装好了,类似肯德基的外带全家桶。在浏览器中访问链接(https://www.continuum.io/downloads)下载和安装 Anaconda,安装完毕后,即可正常使用Python。1.2.2 Sublime

某些语言可能会有自己专用的编辑器和编程环境,如 Java 的 Eclipse 等。这类专用编辑器可以在编写该门语言的代码时,提供提示和快速补全等,或者具备一些语言对应的特殊功能。但笔者更习惯使用并推荐给读者的是一款通用、简单而且强大的文本编辑器——SublimeText。它可以打开任意类型的文本文件,可以用它编写任何语言的代码,如 Python和R,甚至用Latex写论文也是没问题的。1.下载和安装

Sublime Text有2和3两个版本,自然是对应Python的2.7和3.5。同样推荐大家使用Sublime Text 2即可,因为其不需要激活或注册,可直接使用,功能也完全可以满足需求。虽然定期会出现激活提醒的弹窗,但直接关闭即可,并不影响使用。在浏览器中访问链接(http://www.sublimetext.com/2),并根据你的操作系统选择相应版本,下载并安装即可。

安装完成后即可使用Sublime Text,它主要有以下两点好处。(1)支持非常多的扩展插件,每个插件都可以让Sublime Text的功能变得更加强大。(2)代码中的不同地方会用不同的颜色高亮显示,增强可读性和编程体验。2.安装插件

SublimeText 之所以功能强大,是因为其提供了相当多的功能插件。在 SublimeText 中安装插件之前,需要做一些准备工作。打开 Sublime Text 之后,按 Ctrl+`组合键调出Sublime Text的命令行,其中`在键盘上1、2、3等数字键的左边,Sublime Text的软件界面底部将出现一行灰色的输入框。访问链接(https://packagecontrol.io/installation#st2),复制Sublime Text 2标签页中的代码,将其粘贴至刚才出现的命令行中并按回车键,Sublime Text 将运行一些安装工作。运行完毕后重启 Sublime Text,如果在 Preferences 中能看到Package Control一项,则说明准备工作已经完成了。

接下来,按Ctrl+Shift+P组合键调出Package Control,如果是Mac,则使用Command+Shift+P[5],或者直接在 Preferences 中单击 Package Control。输入 install,在提示选项中单击Install Package,然后在列表中查找需要的插件并单击安装即可。如果是卸载插件,则在刚才的Package Control中,输入remove并单击Remove Package,然后选择需要删除的插件即可。3.使用和操作

打开 Sublime Text 之后,可以直接将文件夹拖入 Sublime Text 的软件界面中,文件夹会自动加入 Sublime Text 左半部分的 FOLDERS,在这里可以方便地查看文件夹的目录结构和内容。

在文件夹上右击鼠标,会弹出“新建文件”“重命名文件夹”“新建文件夹”“删除文件夹”“在文件夹中查找”“将文件夹从项目中移除”6个子菜单。其中“删除文件夹”会在系统目录中同时删除该文件夹,而“将文件夹从项目中移除”只是将该文件夹从 SublimeText 的FOLDERS中移除,系统目录中的文件夹依旧保留。1.2.3 运行Python代码的方法

一般来说,运行Python代码的方法主要有以下3种。(1)在系统命令行中输入Python,进入Python提供的交互编程环境,如图1-1所示。其优点是可以交互式执行代码,每敲一行代码后按回车键即可运行,已经生成的变量和函数[6]也保存在编程环境中。缺点是无法修改历史代码并重新运行,代码编辑上也存在诸多不变。因此,这一方法多用于探索和尝试,例如,忘记了某个函数的用法,可以在交互编程环境中运行代码进行尝试。图1-1 Python交互编程环境(2)使用IPython Notebook等交互编程工具。IPython Notebook[7]对Python内核进行了一层Web封装,从而提供了基于Web界面的友好交互编程环境,操作上更灵活、更方便,功能上更自由、更强大,可以便捷地管理文件和项目、交互式进行编程、分块编辑代码并多次运行、轻松实现代码与他人的分享,因此对于编程新手而言也是非常理想的选择。(3)在 Sublime Text 等编辑器中编写代码,编写完毕后直接在编辑器中运行。例如,按 Ctrl+B 组合键可在 Sublime Text 中运行代码。也可以在编写完毕后打开命令行,切换到代码所在目录,输入python code.py,其中code.py是需要运行的代码。

笔者个人更习惯和青睐第三种方法,因为可以享受一气呵成写完所有代码并运行的畅快,当然更主要的原因是Sublime Text提供了非常舒适和便捷的编程体验。1.2.4 Hello World

程序员之间有个不成文的规定,即但凡学点什么新东西都得先来一个 Hello World。在Sublime Text中按 Ctrl+N组合键新建一个文件,输入以下代码之后,按下Ctrl+S组合键保存。文件名任意,后缀名为py,如test.py,保存时记得选择保存的路径。

print 'Hello World'

保存完毕后,按下 Ctrl+B 组合键运行写好的代码,即可看到打印出来的文本内容,如图1-2所示。图1-2 在Sublime Text中打印Hello World1.3 数据结构和常见类型解读数据结构和类型

在正式开始编程之前,为了进一步加强对数据的理解和把握,先了解在日常生活中,数据大多呈现的结构,以及常见的数据类型。1.3.1 数据的结构

在数据技术(Data Technology,DT)时代,我们的日常生活中随时随地都会产生、接触和使用到各式各样的数据,它们的结构和形式具备很多共性。以地铁数据为例,可以将其分为静态数据和动态数据两大类。

静态数据:包括线路信息和站点信息等,例如,一共有哪几条地铁线路,每条线路包含哪些站点,各个站点的名称、首末班车时间等信息。这类数据一般不包含时间戳,更新频率较低,数据量整体较小。

动态数据:主要是地铁的刷卡记录,乘客在进站和出站时的刷卡操作都会产生一条刷卡数据,里面记录了乘客的地铁卡 ID、刷卡站点、刷卡时间、刷卡费用等信息。这类数据一般包含时间戳,用于表明数据产生的时间,并且不断产生、不断积累,往往蕴含巨大的潜在价值。

以上提到的时间戳是怎样的一个概念呢?时间戳是指从1970年1月1日0时0分0秒到某一时刻之间所经历的秒数,可以为整数或浮点数。对于同一个时刻,不同的人会有不同的表述方式,例如“2017年1月1日15时”和“17年元旦下午3点”,即不同格式的时间文本,因此无法统一和计算。通过时间戳的概念,可以使用整数或浮点数来表示任意一个时刻,从而便于代码运算和比较两个时刻之间的时间差。

日常生活中的大多数据都可以使用行和列的结构来表示。每一行表示一条记录,或者称为一项观测。例如,在地铁线路数据里,每一行代表一条地铁线路的记录;每一列表示一个字段,或者称为一项属性。例如,在地铁线路数据里,每行记录可能包含线路名称、运营时间、线路颜色等字段。这种数据结构称为关系型数据,通常会包含一行表头,用于说明每列字段的意义和数值类型,可以用二维数组或二维表的概念来表示。Excel中的表格、关系型数据库,如MySQL中的数据表、R中的数据框、Python中pandas包提供的Dataframe等,都属于这种数据结构。1.3.2 数据的类型1.txt

txt 是最常见的文本数据类型,或许也是我们大多数人第一次使用电脑所接触的文件类型。txt 中存放的是纯文本,可以记录任意文本内容,每行的长度是可变的,文件的总行数也是任意的,因此读写起来非常自由,但也给进一步使用代码处理带来了不便,毕竟机器更擅长处理结构化数据,而不是非结构化数据。2.csv

csv(Comma Separated Values)即逗号分隔值,里面存放的依旧是文本内容,但是以一种定义好的结构进行了组织。可以将 csv 理解为一种文本形式的二维表,每一行代表一条记录,每条记录的字段数量是一致的,字段之间以逗号分隔。当然也可以使用其他符号分隔,例如,制表符分隔则对应tsv(Tab Separated Values)。csv可以包含一行表头,用于说明每个字段的名称和意义。因此csv和Excel中的表格、关系型数据库中的数据表都是类似的。以下是一个简单的例子,表头说明了每行记录包含id、name、gender、age共4个字段。

id,name,gender,age

1,Honlan,male,24

2,Baby,female,223.json

json是一种非常通用的数据类型,里面存放的依旧是文本内容,只不过是以键值对的形式进行了组织,在前端和后端等多种应用场景、多门编程语言中都可以加载使用。就像用字典查单词一样,将json文本解析后,即可用键(key)查找对应的值(value)。如果将csv理解为Python 中的二维数组,即嵌套的列表,就可以将 json 理解为 Python 中的字典。以下是一个简单的例子,这段json文本对应一条用户记录,包含id、name、gender和age共4个键。

{

"id": 1,

"name": "Honlan",

"gender": "male",

"age": 24

}

总地来说,txt、csv 和 json 中存放的都是纯文本内容,不同的只是文本的组织结构,以及文件命名时分别使用.txt、.csv 和.json 作为后缀名。在使用 Python 对以上三类文本数据进行操作和处理时,涉及的思路和步骤也会稍有不同。4.sql

sql 是关系型数据库文件,以最常用的 MySQL 为例,MySQL 中的数据库和数据表都可以导出为.sql 文件用于数据备份,而.sql 文件也可以导入已有的数据库和数据表用于数据恢复。相对于 txt、csv、json 等文本数据,数据库功能更强大、应用场景更丰富,当然也会要求更高的学习成本。本书后续章节会介绍如何使用 MAMP 和 WAMP 等软件在个人电脑上搭建Web环境,里面包括了Web服务器Apache和关系型数据库MySQL,并详细介绍如何操作和使用MySQL数据库。[1].参见《大数据时代》,[英]维克托·迈尔-舍恩伯格 肯尼思·库克耶◎著,盛杨燕 周涛◎译[2].分类和聚类的概念参见第10章机器学习[3].如果将原始语言理解成木材,那么封装和框架便是造好的轮子,可以大大节省开发时间[4].Mac中的命令行即终端,Windows中的命令行即CMD[5].本书中涉及Ctrl键的大部分地方,如果是Mac则对应Command键[6].变量和函数的概念参见第2章[7].IPython Notebook的更多内容参见10.3节第2章 学会Python2.1 Python基础语法

Python 简单易学,但又博大精深。在掌握 Python 语法的基础上,还需要尽可能多地熟悉一些常用的 Python 包。人生苦短,学海无涯,让我们先来了解 Python 中最基础但也最核心的内容。2.1.1 Python的特点先学会基本语法(1)

属于解释型语言,无需编译即可运行。

提供了交互式命令行。

支持面向对象的编程思想。

良好的跨平台兼容性,在Windows、Mac、Linux上都可以运行。

简单好用易学,扩展包丰富,功能强大。2.1.2 中文编码

很多人在读取数据时会出现乱码,归根结底都是字符集的编码问题。Linux 和 Mac 默认的编码集是 UTF-8,而 Windows 则是 ASCII。如果写入数据时使用的编码字符集,和读取数据时使用的解码字符集不同,则会出现乱码问题。

如果在使用 Python 处理数据时出现了类似 can’t decode 之类的错误,多半属于编码问题。推荐在写入和读取数据时都使用 UTF-8编码,这是一种更为全面而且通用的字符集。除此之外,代码文件名称、文件目录路径、数据库名和数据表名等,也建议使用英文字母组合,尽量不要使用中文字符,避免编码问题以及其他不可预知的错误。(http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html)是一篇参考文章,比较详细地介绍了Python中文编码涉及的内容和知识点,推荐阅读并了解。

推荐在Python代码的头部加入以下内容,表示声明了使用UTF-8字符集。

# coding:utf8

出现 can’t decode 之类的错误时,尝试在头部添加以下代码,在很多情况下能够快速解决问题,但是在某些场合,也可能会导致一些潜在问题。

import sys

reload(sys)

sys.setdefaultencoding("utf8")2.1.3 变量

变量是编程语言中最重要的概念。Python 中的变量可以看作一个个容器,里面存放着我们需要用到的值,可存、可取、可更新。Python 对变量名的要求和其他语言一样,可以包括英文、数字以及下画线,但不能以数字开头,变量名区分大小写。当然,推荐变量名用纯英文即可,并且取一些有意义的名称,便于理解和区分每个变量的作用。

因为 Python 是一门弱类型的编程语言,所以在声明变量时无需指定其类型。Python 中的变量主要包括数值、字符串、列表、元组和字典。1.数值

数值即我们常识中的数字,包括整型和浮点型,分别对应整数和浮点数,浮点数精度更高。print 是 Python 提供的一项常用操作,可以将变量打印出来以供查看,用逗号分隔表示同时打印多个变量。

# 整型

a = 1

# 浮点型

b = 2.1

print a, b2.字符串

字符串即我们经常接触到的文本,可以往里面放任意长度的内容,在 Python 代码中需要用单引号或双引号括起来。应当注意,中文和中文符号只能出现在字符串内,如果在下面第三行中使用了中文输入法的逗号,Python将会报错。

c = 'Hello'

d = '你好'

print c, d

使用+可以拼接两个字符串,得到的是两个字符串首尾相连后的结果。

print c + d

使用 len()函数可以得到字符串的长度。可以将函数理解为一台加工的机器,入口放进去一个变量,经过一系列处理,出口的地方便会产生一个新的变量,即我们所需的结果。

print len('Hello World')

使用切片操作可以访问字符串中的某个字符或某个片段,就如同从一条队伍中选出一个人或连续的几个人一样。

# 位置下标从0开始

c = 'Hello World'

# 打印结果为H,下标为0表示第一个字符

print c[0]# 打印结果为d,下标为负数表示从后往前数

# 所以-1表示倒数第一个字符

print c[-1]

# 使用:返回一个片段,冒号前后分别为开始下标和结束下标

# 包括开始下标,但不包括结束下标

# 因此c[1:5]表示,返回下标从1到4的片段,即第二个到第五个字符

print c[1:5]

# 冒号前后的下标同样可以使用负数

# 或者不提供,表示从最左端开始或一直到最右端

print c[1:-1], c[:5], c[3:]3.列表

列表好比一条队伍,里面依次存放着多个变量,所以列表的概念和字符串类似。但字符串中的每个元素都是字符,而列表中的每个元素可以是任意类型的变量,并且变量类型可以不完全一致,甚至列表中可以嵌套列表,所以列表的概念更为广义和通用。

# 使用[]定义一个空列表,使用append()向列表尾部添加一个元素

# 如果要添加到首部,就用prepend()好了

a = []

a.append(1)

a.append(2.1)

a.append('Hello')

print a

类似地,使用len()函数可以获得列表的长度,即列表中元素的个数。

print len(a)

列表元素的按下标访问、切片和赋值等操作,与字符串都是类似的。

print a[1], a[-1]

a[1] = 100

print a

使用del()函数删除列表中的某个元素。

del a[0]

print a4.元组

元组和列表类似,唯一的不同是元组中的元素在初始化之后不能再更改,因此可以理解为一个只读的列表。例如:

# 使用()定义一个元组

a = (1, 2.1, 'Hello')

# 尝试修改元组中的元素会报错

a[0] = 1005.字典

字典是一种极为重要的变量类型。在字典中可以使用一个键(key)来操作相应的值(value),即一种键值对的数据组织形式,好比一本英语词典一样。例如:

# 使用{}定义一个字典

a = {}

# 使用key来赋值value

a['k1'] = 1

a['k2'] = 2.1

a['k3'] = 'Hello'

总结一下字典和列表的不同:列表是一条站好的队伍,其中的元素是有序的,所以用下标来进行赋值和访问等操作;字典是站在一起的一堆人,其中的元素是无序的,所以只有喊出某个人的名字(key),才能知道他/她长什么样(value)。

# 也可以在定义字典和列表中同时赋值

li = [1, 2.1, 'Hello']

di = {'k1': 1, 'k2': 2.1, 'k3': 'Hello'}

使用 has_key()函数判断字典中是否存在某个 key,然后执行不同的处理。例如,已经存在这个 key 了,则更新对应的 value,否则赋一个初始化值。返回结果以逻辑值表示,True为真表示存在,False为假表示不存在。

print di.has_key('k4')

如果操作不存在的 key,Python 将会报错。在赋值时,如果 key 已经存在,则会用新的value覆盖已有的value。2.1.4 注释

被注释的代码将不会运行,就像读书笔记一样,可以看作是写给自己和他人阅读的一些标注和说明,用于提高代码的可读性。

# 这里是单行注释

'''

这里是

很多行

注释

'''

在 Sublime Text 中,选中需要注释的单行或者多行内容,按 Ctrl+/组合键即可进行注释。2.1.5 保留名

在 Python 中,有一些字符串具备某些特殊含义,称为保留名,如 import、class 等。在选取变量名时,应注意避开这些保留名。

# 以下变量赋值将报错

import = 12.1.6 行和缩进

在 Python 中,代码块的边界不是通过大括号等符号进行显式划分,而是通过行的缩进隐含的。连续相同缩进水平的代码处于同一个代码块,在使用 for、while、if、try 等语法时,需要注意每行代码的缩进量,缩进量存在问题除了会报错外,甚至可能会完全改变代码的运行逻辑。2.1.7 运算符

运算符的作用是在已有变量的基础上进行一些原子操作,从而生成新的变量,主要有以下几大类。需要注意的是,在代码中输入这些运算符时需要使用英文输入法。

算术运算符: +(加)、-(减)、*(乘)、/(除)、%(取余)。

比较运算符: ==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。

赋值运算符: =(赋值)、+=(加赋值)、-=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(取余赋值)。

逻辑运算符: and(与)、or(或)、not(非)。

a = 1

b = 2

print a + b

print a == b

# 等价于 a = a + 3

a += 3

print a

c = True

d = False

print c and d, c or d, not c2.1.8 条件先学会基本语法(2)

在编写代码时,经常需要根据某些条件进行判断,并根据判断结果是否成立执行不同分支的后续处理,这里的是否成立便是逻辑值中的 True和False。

a = 1

# 单个条件

if a == 1:print 11111

# 处理条件不成立的分支

if a == 2:print 22222

else:print 33333

# 多个条件,加多少个都可以

if a == 1:print 11111

elif a == 2:print 22222

else:print 33333

需要注意的是,只要出现了if和elif,就需要加上相应的判断条件,并且严格注意代码的缩进。在Sublime Text中输入if会出现相应提示,按回车键可快速补全代码,换行时,光标也会自动跳到合适的缩进处。2.1.9 循环

如果需要打印1~100的100个数,自然不能傻傻地写100行print代码,而应该用循环来处理类似的重复性工作。1.while循环

while 循环的基本思想是,只要某一条件成立,就不断执行循环体里的代码,直到该条件不再成立,条件是否成立同样是使用逻辑值来表示。

flag = 1

while flag < 10:print flag# 一定要记得在循环体里修改条件变量# 否则可能导致死循环flag += 12.for循环

for 循环的循环次数一般是事先定好的,将一个条件变量从某个起始值开始,一直迭代到某个终止值后结束。

# x从0开始,一直到9结束,即不包括后面的数字

for x in xrange(0, 10):print x

可以用 for 循环方便地遍历之前提到的列表和字典。因为遍历是将目标中的所有数据都处理一次,因此可以用循环的思想来实现。

li = [1, 2.1, 'Hello']

dict = {'k1': 1, 'k2': 2.1, 'k3': 'Hello'}

# 遍历列表,这里的item只是一个临时变量,取别的名称也行

for item in li:print item

# 遍历字典的全部key,这里的key也只是一个临时变量,名称不重要

for key in dict.keys():print key

# 遍历字典的全部value,这里的value也只是一个临时变量,名称不重要

for value in dict.values():print value

# 同时遍历key和value

for key, value in dict.items():print key, value3.循环控制

循环控制是指在循环的过程中,根据某些条件的当前状态,选择性地控制或改变循环原本的流程,主要包括3种:pass、continue、break。

pass 表示什么也不做,只是占据一行代码的位置;continue 表示立即退出本轮循环,不运行本轮循环的后续代码,并继续执行接下来的循环;break 表示立即退出整个循环,后续循环不再执行。

for x in xrange(0, 10):if x == 5:

passelse:

print x

for x in xrange(0, 10):if x == 5:

continueprint x

for x in xrange(0, 10):if x == 5:

breakprint x2.1.10 时间

在处理数据时,很多地方都会涉及时间,例如,数据产生的时间,即之前提及的时间戳概念。为什么需要时间戳这样一个概念?因为对于同一个时刻,不同人的描述可能不同,毕竟文本表达的形式千变万化,而时间戳使时刻的表示得到了统一,每个时刻只能用唯一的整数或浮点数来表示,也便于计算时间差之类的数值处理。

import time

# 来看一下当前时刻的时间戳

t = time.time()

print t, type(t)

关于时间戳,最常见的处理便是时间戳和时间文本之间的相互转换,例如,将“2016-10-0110:00:00”转为时间戳。

import time

# 时间文本转时间戳,精确到秒

a = '2016-10-0110:00:00'

a = int(time.mktime(time.strptime(a, '%Y-%m-%d %H:%M:%S')))

print a

# 时间戳转时间文本

b = int(time.time())

b = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(b))

print b

其中%Y、%m等都是时间格式模板,前者表示4位的年份,后者表示两位的月份。2.1.11 文件先学会基本语法(3)

文件操作包括向文件中写内容,以及从文件中读内容。可以使用 open()函数打开一个文件,打开时需要指定相应的操作模式。

# 写文件

# 重新写模式,打开文件时会将文件内容清空

fw = open('data.txt', 'w')

# a为追加写模式,打开文件后保留原始内容,继续写入

for x in xrange(0, 10):# 将整数转成文本再写入fw.write(str(x))# 也可以每次写入之后换行,\n为转义字符,表示换行# fw.write(str(x) + '\n')

fw.close()

# 读文件

fr = open('data.txt', 'r')

# 一行一行地读,line只是个临时变量,取别的名称也行

for line in fr:print line# 如果每行后面有换行,可以将换行符去掉,使内容更紧凑# strip()可以去掉字符串两端的空白字符# print line.strip()

# 关闭文件

fr.close()2.1.12 异常

Python 代码中可能会出现一些可以预知的错误,我们称之为异常,如字典访问的 key 不存在、除数为0等。如果对这类潜在错误不加处理,发生问题时,Python 会报错并退出,可能之前跑了很久的程序又要重头再来。因此,需要对可能出现的异常进行捕捉和处理。异常的结构由try、except、else、finally四部分组成。在Sublime Text中输出try会出现相应的提示,按回车键可快速补全。

try:# 尝试执行这些代码print 1 / 0

except Exception, e:# 如果出现异常就进行处理# e为出现的异常print e

else:# try中的代码没有出错# 可以执行后续工作了print '没有出错'

finally:# 无论是否出错,都会执行的代码print ' 一定会执行'2.1.13 函数

函数的作用是将代码模块化,把可重用的代码封装成一个函数,这样在需要使用时,只需调用写好的函数即可,而不用重新写一遍代码。就像购买了一台榨汁机,每次想喝果汁时,只需要把水果丢进去处理即可。

函数的使用包括两个部分,函数的定义和函数的调用。除此之外,函数可以接受一个或多个变量作为参数,参数之间以逗号分开,为函数的功能提供更多的灵活性。需要注意的是,定义和调用部分的参数应当一一对应,除非在定义时为某些参数提供了默认值。

# 定义函数

def hello(name1, name2):print 'Hello' + name1 + ' ' + name2

# 调用函数

hello('Python', 'JavaScript')2.1.14 补充内容

以上介绍的,都是 Python 中最基础和最核心的内容,掌握这些内容之后便可继续学习后续章节。当然,如果希望更系统地学习 Python,可以参考以下链接,虽然学习时间更长、成本更高,但Python的知识能掌握得更全面、更深入。

菜鸟Python教程,(http://www.runoob.com/python/python-tutorial.html)

廖雪峰Python教程,(http://www.liaoxuefeng.com/wiki/0014316089557264a6b 348958f449949df42a6d3a2e542c000/)2.2 实战:西游记用字统计实战 西游记用字统计

这一节将通过一个简单的实战项目,来巩固之前学习的Python基础语法。2.2.1 数据

实战项目中使用的数据可以在笔者的Github上找到(https://github.com/Honlan/fullstack-data-engineer)。将整个项目下载并解压之后,里面的 data 文件夹中便包含了本书用到的全部数据和文件,codes 文件夹中包含了全部实战项目对应的完整代码。什么是 Github呢?可以把它理解成受欢迎的程序员社交场所,来自全世界的人都在 Github 上开发、维护和共享代码。

这次将用到 xyj.txt,里面是小说巨著《西游记》的文本内容,使用 UTF-8编码,文件大小为2.2MB。凝聚了吴承恩大师毕生心血的作品,如今用2MB 左右的空间就可以将其全部存储下来,这正是信息时代带来的进步和巨变。2.2.2 目标

使用Python读取《西游记》的文本内容,并进行以下统计。

共出现了多少个不同的汉字。

每个汉字分别出现了多少次。

哪些汉字出现得最为频繁。

在xyj.txt的同级目录下新建一个py文件,然后开始实战。2.2.3 步骤(1)定义一个读文件,读取准备好的xyj.txt。

fr = open('xyj.txt', 'r')(2)准备一个列表characters 和一个字典 stat,分别用来记录出现的汉字和每个汉字出现的次数。

characters = []

stat = {}(3)遍历读文件中的每一行,并进行统计。统计结果显示,《西游记》中共出现了4511个不同的汉字。

for line in fr:# 去掉每一行两边的空白line = line.strip()# 如果为空行则跳过该轮循环if len(line) == 0:

continue# 将文本转为unicode,便于处理汉字line = unicode(line)# 遍历该行的每一个字for x in xrange(0, len(line)):

# 去掉标点符号和空白符

if line[x] in [' ', '\t', '\n', '。', ',', '(', ')', '(', ')', ':', '□', '?', '!', '《', '》', '、', ';', '“', '”', '……']:

continue

# 尚未记录在characters中

if not line[x] in characters:

characters.append(line[x])

# 尚未记录在stat中

if not stat.has_key(line[x]):

stat[line[x]] = 0

# 汉字出现次数加1

stat[line[x]] += 1

print len(characters)

print len(stat)(4)对 stat 按值进行排序,即按照每个汉字出现的次数降序排序。排序之后会得到一个列表,因为字典是无序的,而列表是有序的。

# lambda 生成一个临时函数

# d表示字典的每一对键值对,d[0]为key,d[1]为value

# reverse为True表示降序排序

stat = sorted(stat.items(), key=lambda d:d[1], reverse = True)(5)定义一个写文件,将统计和排序结果写入文件。

fw = open('result.csv', 'w')

for item in stat:# 进行字符串拼接之前,需要将int转为strfw.write(item[0] + ',' + str(item[1]) + '\n')(6)关闭读文件和写文件。

fr.close()

fw.close()

完整代码可以参考codes 文件夹中的5_xyj.py。2.2.4 总结

通过这样一个简单项目,我们温习了 Python 中的读文件和写文件操作、列表和字典的使用、字典的排序等内容。Python 的功能很强大,打开你的脑洞,去学习新的包,用 Python实现一些你能想到的事情。第3章 获取数据3.1 HTTP请求和ChromeHTTP请求和Chrome

我们在浏览网页时,网页上显示的文字和图片等数据从何而来?为了弄清这一点,需要首先了解什么是HTTP。3.1.1 访问一个链接

首先在浏览器中访问以下网页链接:http://kaoshi.edu.sina.com.cn/college/scorelist? tab=batch&wl=1&local=2&batch=&syear=2013

这是由新浪教育提供的一个高考信息查询网站。

每个网页链接,或者称作URL,通常由以下形式组成:协议://域名:端口/路由?参数

协议:数据传输使用的协议,如HTTP。

域名:所访问服务器的域名,如 kaoshi.edu.sina.com.cn,如果没有域名,则为服务器IP。

端口:链接使用的端口,HTTP的默认端口是80,可以省略。

路由:不同的路由会请求不同的功能。例如,college/scorelist 请求的是查看大学的分数线列表这一功能。

参数:请求数据时提供的参数,参数的key和value由“=”连接,参数之间以“&”分隔,例如,(tab=batch&wl=1&local=2&batch=&syear=2013)指定返回2013年的数据。

可以在命令行中使用 ping 访问某一个 URL,测试其是否能正常连接,并且查看域名对应的IP。

ping kaoshi.edu.sina.com.cn

在浏览器中访问一个 URL,就能看到对应网页上的文字和图片等内容。这一过程主要包括以下几个步骤,其中的数据传输大多是基于HTTP实现的。

浏览器向所访问的服务器请求指定的URL。

服务器根据URL返回相应的数据。

浏览器加载返回的数据,经渲染后以网页的形式呈现给用户。3.1.2 Chrome浏览器

在正式介绍HTTP之前,先了解Chrome浏览器,以了解一些必须掌握的背景知识。

Chrome 是一款优秀的浏览器,渲染效果和调试功能都非常强大。在 Chrome 浏览器中打开网页后,在页面上右击鼠标,可以找到“显示网页源代码(View Source)”和“检查(Inspect)”两项功能。前者可以查看网页的静态源代码,后者则提供了相当强大的调试功能。

以之前访问的新浪教育网页为例,在网页的某一个元素,如页面顶部的“新浪首页”上,右击并选择“检查”之后会出现图3-1所示界面,即 Chrome 提供的“开发者工具(Developer Tools)”,默认显示在Elements标签页上,并且高亮显示右击元素对应的代码。图3-1 Chrome开发者工具界面

开发者工具包括 Elements、Console、Sources、Network 等多个标签页,分别提供了以下功能。

Elements:显示网页经过渲染之后的结构,可以任意调整和修改网页元素,并即时显示修改结果。

Console:打印变量信息,用于代码调试,网页运行过程中产生的警告和报错也会出现在这里。

Sources:查看网页使用到的全部资源文件。

Network:查看网页请求的各类资源文件及其对应的请求时间。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载