Python3 实战——文件读取

作者: Daniel Meng

GitHub: LibertyDream

博客:明月轩

本系列教程采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议

读取 zip 文件

压缩文件能帮助我们节省空间和时间。ZIP 是种存档文件,支持无损数据压缩。用 Python 打开 ZIP 文件夹先得有 Zip File 库。

本文所有文件都已打包进独立 ZIP 文件中,来提取看看吧。

执行上面的代码后,可以在同目录下的 apply/data/demo data 文件夹中看到相同结构内容

读取 Text 文件

文本文件算是最常见的文件格式了。Python 用 open() 方法读取指定路径的文件,并用参数指定访问方式。读文件模式为 r,还有其他访问模式:

Python 提供了三种方法读取文本文件:

  1. read(n) – 从文本中读取 n 个字符,不指定数字就读取全部。可以自动识别定界符并分隔句子。
  2. readline(n) – 从文件中读取 n 个字符,但不超过一行
  3. readlines() – 读取全部信息,但不同于 read(),该方法不会管分隔符,将其一并读入列表

来看看这些方法读文件时的异同吧:

read() 方法成功以结构化的方式读入了所有数据。

read() 指定一个数后,可以读取定量的字符

用了 readline(),只读了一行文本进来

这里 readlines() 方法将整个文本提取成了列表格式。

用 Pandas 导入 CSV 文件

经典的 CSV 格式。CSV( Comma Separated Value,字符分隔值)文件算是数据科学行业里最常见的文件类型了。这类文件用 , 作分隔符分隔数据值,文件中的一行就是一条数据记录。如果用 Notepad 打开,你会看到类似这样的数据格式:

通过 Pandas 库可以很方便的用 read_csv() 方法读取 CSV 文件

但数据值里包括逗号的话 CSV 文件就会遇到问题。这可以靠采用不同分隔符解决,比如 \t; 等:

读取 Excel 文件

想必你对 Excel 文件不会陌生,谈到表格类数据必定少不了它。Pandas 提供了一个很方便的方法 read_excel() 读取 Excel 文件:

但 Excel 文件通常有多个表单,此时可以用 Pandas 的 ExcelFile() 方法打印文件内所有表单名称:

这样我们就可以通过参数 sheet_name 借助 read_excel() 方法读取任意表单内的数据了:

从数据库导入

实际项目中,免不了从项目数据库中提取数据(所以 SQL 还是得学滴)。数据在数据库中是以表格形式存储的,(一般)这些系统又名关系数据库管理系统(RDBMS),访问不同数据库需要不同的 PYthon 模块支持,比如 SQLite 需要 sqlite3,MySQL 需要 mysql-connector。

一般的数据访问步骤为:

  1. connect() 创建一个数据库连接,需要传入要访问的数据库名。它会返回一个 Connection 对象
  2. cursor() 创建一个 cursor 对象,通过它实现操作数据的 SQL 指令
  3. 调用指针对象的 execute() 方法执行 SQL 命令。检索数据会用到 SELECT 语句,并将查询存入一个对象
  4. 将对象内数据读入 DataFrame 可以通过 fetchone() 读入一行,或是 fetchcall() 读取所有行

一个好习惯是,即使只是读取数据,也用 commit() 方法将你的事务保存/提交。

JSON 文件处理

JSON (JavaScript Object Notation) 是用于数据存储、交换的轻量可读文件格式。机器很容易解析、生成这些文件。

JSON 中的数据用类似 Python 字典的方式存在 {} 中,JSON 是语言独立的,一般文件长这样:

Python 提供了 json 模块来读取 JSON 文件,像读文本一样简单。只不过这里的读方法变成了 json.load(),其返回一个 JSON 字典。

接着就可以用 pandas.DataFrame() 方法将其转换成 Pandas dataframe 格式了。

你甚至可以用 pandas.read_json() 直接将 JSON 文件读入 dataframe:

读取 Pickle 文件

Pickle 文件常用于存储 Python 序列化对象,也就是说像 list,set,tuple,dict 这些在存入磁盘前先被转换成了字符流。这可以让你之后继续使用对象,当训练完模型想存起来之后预测用时,这就能派上用场了。

所以,如果存储前将文件序列化了,用之前就得先反序列化,这可以通过 pickle 模块的 pickle.load() 方法实现。在用 open() 打开 pickle 文件时候记得得用 rb 做参数,相应的,写入时记得用 wb

网络爬虫

网络爬虫就是从网络上抓取海量数据,这对要分析数据的数据科学家来讲很重要。

Python 提供了 requests 模块方便我们从网络获取数据。requests.get() 方法接收一个 URL 参数并返回相应的 HTML 结果。其工作流程可以概括为:

  1. 将 Get 请求打包来从网页检索数据
  2. 将请求发给服务器
  3. 收到 HTML 答复并存入 response 对象

比如想了解北京市,从维基百科抓获的数据形式如下

但如你所见,数据可读性并不怎么好,请求返回的内容没有很好的展示 HTML 的树形结构。为改善可读性,Python 提供了另一个很棒的 BeautifulSoup 库。

BeautifulSoup 是用来解析 HTML 树形结构并提取 HTML 内容的一个库。_更多爬虫内容见教程_

用的时候把得到的答复文本传给 BeautifulSoup(),它会创建自己的“soup”对象。调用 BeautifulSoup 对象的 prettify() 解析 HTML 内容树

输出格式发生了明显变化。现在,可以通过 soup 对象的 title 属性来查看网页标题了

网页上有很多北京的名胜古迹与地标照片,不妨把它们存到本地文件夹里。

这要用到 python 的 urlib 库来检索要保存图片的 URL,它有一个 urllib.request() 方法用来打开和读取 URL,调用该对象的 urlretrieve() 方法可以将 URL 表示的对象下到本地文件中:

图像都存在 HTML 的“img”标签下,可以调用 soup 对象的 find_all() 将他们找出来。然后就可以遍历图像,用 image 对象的 get() 获取原图。

用 PIL 读取图像

在用 CNN 之类的技术分析图像前,总得先知道怎么把图像读进来。以上面存好的图像为例,为此你需要用到 Python 的 PIL(Python Image Library) 库。

调用 PIL 里 Image 模块的 open() 方法并把图像路径传进去:

用 Glob 读取多个文件

如果你想一口气读取多个文件怎么办?这可算是很常见的需求了

Python 的 Glob 模块可以遍历同一位置的多个文件。用 glob.glob() 可以将本地文件夹中符合特殊模式的文件一并导入。

文件名模式可以用不同的通配符表示,比如 * 可以匹配多个字符,? 匹配单个字符,或者 [0-9] 匹配任意数字。

举例来讲,从相同目录导入多个 .py 文件,可以用通配符 *

导入只有五个字符的 Python 文件,可以用 ?

导入文件名中带数字的图像文件时,可以用[0-9]:

上面我们从维基百科下了些北京的图片,并存到了本地。现在我们来用 glob 模块检索,然后用 PIL 库展示: