前 言
如果你是数据行业的一份子,那么你肯定会知道和不同的数据类型打交道是件多么麻烦的事。不同数据格式、不同压缩算法、不同系统下的不同解析方法——很快就会让你感到抓狂!噢!我还没提那些非结构化数据和半结构化数据呢。
对于所有数据科学家和数据工程师来说,和不同的格式打交道都乏味透顶!但现实情况是,人们很少能得到整齐的列表数据。因此,熟悉不同的文件格式、了解处理它们时会遇到的困难以及处理某类数据时的最佳/最高效的方法,对于任何一个数据科学家(或者数据工程师)而言都必不可少。
在本篇文章中,你会了解到数据科学家或数据工程师必须知道的几种常规格式。我会先向你介绍数据行业里常用的几种不同的文件格式。随后,我会向大家介绍如何在 Python 里读取这些文件格式。
PS:在后文中提到的数据科学家,同样也包括数据工程师以及所有的数据科学专家。
目 录
1. 逗号分隔值
2. XLSX
3. ZIP
4. 纯文本(txt)
5. JSON
6. XML
7. HTML
8. 图像
9. 分层数据格式
10. PDF
11. DOCX
12. MP3
13. MP4
1. 文件格式是什么。
文件格式是计算机为了存储信息而使用的对信息的特殊编码方式。首先,文件格式代表着文件的类型,如二进制文件或者 ASCII 文件等。其次,它体现了信息组织的方式。比如,逗号分隔值(CSV)文件格式用纯文本来储存列表数据。
为了识别一个文件的格式,你通常会去看这个文件的扩展名。比如,一个以“CSV”格式保存的名为“Data”的文件下方的文件名会显示为“Data.csv”。看到“.csv”这个扩展名,我们就会清楚地知道这是一个“CSV”文件,并且还可以知道其中的数据是以表格的形式储存的。
2. 数据科学家应当了解各种不同文件格式的原因。
通常,你碰到的文件类型取决于你当下构造的应用。举个例子,在一个图像处理系统中,你需要把图像作为输入和输出。所以,你所见到的文件大都是jpeg、gif 或者 png 格式的。
作为一个数据科学家,你需要了解各种文件格式的底层结构以及相应的优势和劣势。只有了解了数据的底层结构,你才能够进一步去探索它,或者决定如何来储存相关的数据。
选择一个最理想的文件格式来储存数据能够提升你的模型在处理数据时的性能。
现在,让我们讨论一下下方这些文件格式以及如何在 Python 中读取它们:
3. 不同的文件格式以及从 Python 中读取这些文件的方法。
3.1 逗号分隔值
逗号分隔值文件格式属于电子表格文件格式的一种。
什么是电子表格文件格式?
在电子表格文件格式中,数据被储存在单元格里。每个单元格都处于特定的行和列中。电子表格文件中的列拥有不同的类型。比如说,它可以是字符串型的、日期型的或者整数型的。最常用的电子表格文件格式包括:逗号分隔值(CSV)、Microsoft Excel 电子表格(xls)以及 Microsoft Excel Open XML 电子表格(xlsx)。
CSV 文件中的每一行都代表一份观察报告,或者也可以说是一条记录。每一个记录都包含一个或者更多由逗号分隔的字段。
有时你看你会遇到用制表符而非逗号来分隔字段的文件。这种文件格式被称为 TSV(制表符分隔值)文件格式。
下面是一个用 Notepad 打开的 CSV 文件。
在 Python 中从 CSV 文件里读取数据
现在让我们看看如何在 Python 中读取一个 CSV 文件。你可以用 Python 中的“pandas”库来加载数据。
import pandas as pd
df = pd.read_csv(“/home/Loan_Prediction/train.csv”)
上方的代码将会把 train.csv 文件加载进 DataFrame df 中。
3.2 XLSX文件
XLSX 是 Microsoft Excel Open XML 的文件格式,它同样可以归入电子表格文件格式这一类中。它是由 Microsoft Excel 开发的一种基于 XML 文件格式。Microsoft Office 2007 最先采用 XLSX 格式来储存数据。
在 XLSX 中,数据被放在工作表的单元格和列当中。每个 XLSX 文件可能包含一个或者更多工作表,所以一个工作簿中可能会包含多个工作表。
下面是一个在 Microsoft Excel 中打开的“xlsx”文件。
上图显示的这个文件里包含多个工作表,这些工作表的名称分别为 Customers、Employees、Invoice 和 Order。图片中显示的是其中一个工作表——“Invoice”——中的数据。
从 XLSX 文件读取数据
让我们一起来加载一下来自 XLSX 文件的数据并且定义一下相关工作表的名称。此时,你可以用 Python 中的“pandas”库来加载这些数据。
import pandas as pd
df = pd.read_excel(“/home/Loan_Prediction/train.xlsx”,sheetname = “Invoice”)
上方的代码将会把来自“train.xlsx”文件的工作表“Invoice”加载进 DataFrame df 中。
3.3 ZIP 文件
ZIP 格式是一种归档文件格式。
什么是归档文件格式?
在归档文件格式中,你可以创建一个包含多个文件和元数据的文件。归档文件格式通常用于将多个数据文件放入一个文件中的过程。这么做是为了方便对这些文件进行压缩从而减少储存它们所需的存储空间。
有很多种常用的电脑数据归档格式可以创建归档文件。Zip、RAR 和 Tar 是最常用的3种用于压缩数据的归档文件格式。
因此,ZIP 文件格式是一种无损压缩格式,这意味着如果你用 ZIP 格式压缩了多个文件,那么在解压缩之后你能够完全恢复这些数据。ZIP 文件格式使用多种压缩算法来压缩文件。你可以通过 .zip 这个扩展名轻易地识别出一个 ZIP 文件。
在 Python 中读取 .ZIP 文件
你可以通过导入“zipfile”包来读取 zip 文件。下方的代码可以实现读取“T.zip”中的“train.csv”文件。
import zipfile
archive = zipfile.ZipFile('T.zip', 'r')
df = archive.read('train.csv')
在这里我已经讨论了其中一种最常用的归档格式,也已经讨论了如何在 python 中打开这种归档格式。我不会再对其他的归档格式进行展开讨论。如果你想了解不同类型的归档格式并且想对其做出比较,可以点开这个链接:https://en.wikipedia.org/wiki/Comparison_of_archive_formats。
3.4 纯文本(txt)文件格式
在纯文本文件格式中,所有的内容都是纯文本。通常,这个文本的形式是非结构的,而且也没有与元数据关联。txt 文件格式可以被任何程序读取。但是如果想通过计算机程序来解析它,并不是件容易的事。
让我们以一个文本文件为例。
下面是一段包含了文本的文本文件数据:
“In my previous article, I introduced you to the basics of Apache Spark, different data representations
(RDD / DataFrame / Dataset) and basics of operations (Transformation and Action). We even solved a machine
learning problem from one of our past hackathons. In this article, I will continue from the place I left in
my previous article. I will focus on manipulating RDD in PySpark by applying operations
(Transformation and Actions).”
假设上面的文本来自一个名叫 text.txt 的文件,如果你想要读取它,那么可以参考下方的代码。
text_file = open("text.txt", "r")
lines = text_file.read()
3.5 JSON 文件格式
JavaScript 对象表示法(JSON)是一个基于文本的开放式标准,通常用于在网络上交换数据。JSON 格式被用来在网络上传输结构化数据。JSON 文件格式可以被任何编程语言轻易读取,因为它是一种独立于语言的数据格式。
请看下面某个 JSON 文件的样例。
下面我们看到的是一个典型的 JSON 文件储存员工信息的过程。
{
"Employee": [
{
"id":"1",
"Name": "Ankit",
"Sal": "1000",
},
{
"id":"2",
"Name": "Faizy",
"Sal": "2000",
}
]
}
读取 JSON 文件
让我们加载来自 JSON 文件的数据。你可以使用 Python 中的“pandas”库来加载数据。
import pandas as pd
df =pd.read_json(“/home/kunal/Downloads/Loan_Prediction/train.json”)
3.6 XML 文件格式
XML 同样被称为可扩展标记语言。从名字中我们可以看出,它是一种标记语言,在编码数据时需要遵循某些规则。XML 文件格式是一种既人类可读又机器可读的文件格式。XML 通常用于网络上发送信息的自描述语言。XML 和 HTML 非常类似,但是它们之间也存在某些区别。比如,XML 并不像 HTML 那样使用预定义表情。
<?xml version="1.0"?>
<contact-info>
<name>Ankit</name>
<company>Anlytics Vidhya</company>
<phone>+9187654321</phone>
</contact-info>
“<?xml version=”1.0″?>”是一个 XML 声明,它会出现在文件开始处(位置可以改变)。在这个声明中,version 指明了 XML 的版本,encoding 指明了文档中使用的字符编码。<contact-info> 是该文档中的一个标签。所有 XML 标签都需要被关闭。
在 python 中读取 XML
你可以导入 xml.etree. ElementTree 库来读去 XML 文档中的数据。
让我们导入一个名叫 train 的 xml 文件,然后打印它的根标签。
import xml.etree.ElementTree as ET
tree = ET.parse('/home/sunilray/Desktop/2 sigma/train.xml')
root = tree.getroot()
print root.tag
3.7 HTML 文件
HTML 的全称是超文本标记语言。它是一种用于创建网页的标准通用标记语言。HTML 通过标记来描述网页的结构。HTML 的标签和 XML 的相同,但是它们已经被预定义过。根据标签你能够轻易地识别出 HTML 文件的分段,比如说<head>代表 HTML 文件的头部,<p>代表段落。HTML 不区分大小写。
下面是一个 HTML 文档。
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body><h1>My First Heading</h1>
<p>My first paragraph.</p></body>
</html>
HTML 的每一个标签都需要放在尖括号(<>)里。<!DOCTYPEhtml> 定义文档使用的是 HTML 格式。<html> 是这个文档的根标签。<head> 指的是这个文档的头部分。<title>、<body>、<h1>、<p> 分别代表 HTML 文件中的标题、内容、头部和段落。
读取 HTML 文件
为了读取 HTML 文件,你可以使用 BeautifulSoup 库。请参考教程 Beginner’s guide to Web Scraping in Python using BeautifulSoup:
https://www.analyticsvidhya.com/blog/2015/10/beginner-guide-web-scraping-beautiful-soup-python/,它会告诉你如何解析 HTML 文件。
3.8 图像文件
在数据科学所能用到的所有文件格式中,图像文件也许是最让人着迷的那一个。任何计算机视觉应用都是图像处理为基础的。所以,了解不同的图像文件格式是非常有必要的。
图像文件通常都是3维的,它们拥有 RGB 值。但是它们也可以是2维(灰度图像),甚至是4维(拥有强度)的——由像素组成并且关联了元数据的图片。
每张图片都是由一个或者多个像素帧组成的。每一帧都由像素值的2维阵列组成。像素值可以具有任何强度。和一张图片关联的元数据可以是图像类型(.png)的,也可以是像素类型的。
让我们试着加载一张图片。
from scipy import misc
f = misc.face()
misc.imsave('face.png', f) # uses the Image module (PIL)
import matplotlib.pyplot as plt
plt.imshow(f)
plt.show()
现在,让我们确认一下这个图片的类型和形状。
type(f) , f.shape
numpy.ndarray,(768, 1024, 3)
如果你想阅读关于图像处理的内容,你可以参考文章 Basics of Image Processing in Python:https://www.analyticsvidhya.com/blog/2014/12/image-processing-python-basics/。它会用实例来教会你如何处理图像。
3.9 分层数据格式(HDF)
在分层数据格式(HDF)中,你可以轻易地储存大量的数据。它不仅可以储存高容量或者复杂的数据,同样也可以储存小容量或者简单的数据。
使用 HDF 的优势如下:
现在我们能够见到很多种 HDF 格式。但是,最新版的 HDF5 能够突破过去的 HDF 文件格式所受的某些限制。HDF5 格式和 XML 具有一定的相似之处。和 XML 一样,HDF5 文件也具有自定义功能,它允许用户规定复杂的数据关系和依赖关系。
让我们以一个 HDF5 文件格式为例进行做简单的讲解。
读取 HDF5 文件
你可以使用 pandas 来读取 HDF 文件。下面的代码可以将 train.h5 的数据加载到“t”中。
t = pd.read_hdf(‘train.h5’)
3.10 PDF 文件格式
PDF(便携式文件格式)是一种非常好用的格式,它能够解析并显示与图片结合在一起的文本。PDF 文件的一个特色就是它可以设置密码来保护文件。
下面是一个 pdf 文件。
读取 PDF 文件
利用程序来读取 PDF 格式是一个非常复杂的工作。但是目前已经存在一些能够很好的解析 PDF 文件的库,其中就包括 PDFMiner。想要通过 PDFMiner 来读取 PDF 文件,你需要:
pdf2txt.py <pdf_file>.pdf
3.11 DOCX 文件格式
Microsoft word docx 文件是另一种常用的记录文本数据的文件格式。它具有众多特性,比如可以嵌入表格、图片、超链接等等。这使得 docx 成为一种极其重要的文件格式。
比起 PDF 文件,docx 文件的优势在于可以进行编辑,你可以把一个 docx 文件转换成其他格式的文件。
下面是一个 docx 文件:
读取 docx 文件
和 PDF 格式类似,python 也拥有一个解析 docx 文件的库。它叫做 python-docx2txt。
通过 pip,很容易就能安装此库,输入:
pip install docx2txt
为了在 Python 中读取 docx 文件,输入以下代码:
import docx2txt
text = docx2txt.process("file.docx")
3.12 MP3 文件格式
MP3 文件格式属于多媒体文件格式。多媒体文件格式和图像文件格式比较相似,但是 MP3 文件格式是文件格式中最为复杂的类型。
在多媒体文件格式中,你可以储存多种数据,比如文字图片、图形图片、视频和音频数据。其中,多媒体格式可以把文本储存为 RTF 格式的数据而不是纯文本格式中的 ASCII 数据。
MP3 是最常用的音频编码格式。mp3 文件格式使用 MPEG-1 编码格式,它是视频、音频有损压缩的标准格式。在有损压缩中,一旦你对原始文件进行了压缩,你就不可能再恢复原始的数据了。
mp3 文件格式通过滤掉人耳不能听到的声音来对音频进行压缩。原始文件经过MP3 压缩后其大小一般会减少75%到95%,因此能够节省很多空间。
mp3 文件格式结构
一个 mp3 文件由若干帧组成。其中,每个帧又可以进一步分为帧头和数据块。我们称帧的排列顺序为码流。
mp3 的帧头通常标志一个有效帧的开端,数据块则包含频率和振幅这类(压缩过的)音频信息。如果你想更加了解 mp3 的文件结构,请参考此链接:https://upload.wikimedia.org/wikipedia/commons/0/01/Mp3filestructure.svg。
在 python 中读取多媒体文件
想在 Python 中读取多媒体文件或者对其进行操作,你需要使用名叫 PyMedia 的库:http://pymedia.org/tut/index.html。
3.13 MP4 文件格式
MP4 文件格式用于储存视频和影片。它包含了很多图片(被称为帧),这些图片在特定的时间段中播放,从而呈现出视频的形式。有两个方法可以解析 mp4 文件:一种是把整个视频看作单个的实体;另一种则是把视频中的每一张图片看作不同的实体,认为图片是从视频中抽样得到的。
下面是一个 MP4 视频。
读取 MP4 文件
python 同样也有一个用于读取和编辑 MP4 文件的库,名叫 MoviePy。
你可以从 http://zulko.github.io/moviepy/ 下载这个库。为了读取 MP4 视频片段,请在 Python 中使用如下代码:
from moviepy.editor import VideoFileClip
clip = VideoFileClip(‘<video_file>.mp4’)
随后你可以在 jupyter notebook 中显示它,输入:
ipython_display(clip)
尾 声
在本文中,我向大家介绍了一些数据科学家每天都要用到的基本的文件格式。但是有很多其他的文件格式,我没有来得及向大家介绍,可能会在其他文章的中陆续向大家呈现。
我希望这篇文章能让你有所收获,同时也希望你能探索更多的文件格式。祝你好运!
本文作者 Ankit Gupta 目前是 IIIT Allahabad 的研究助理,他喜欢解决复杂的数据挖掘问题,从而更多地了解数据科学和机器学习算法。目前正在开发一个软件缺陷预测项目。
本文由 AI100 编译,转载需得到本公众号同意。
编译:AI100
原文链接:https://www.analyticsvidhya.com/blog/2017/03/read-commonly-used-formats-using-python/