无论是数据分析、机器学习,甚至高级AI,数据源的获取都是所有流程的切入点。大多数数据源以数据库或文件的形式存在。如果把数据看成一种特殊格式的文件,那么所有的数据源都是文件。获取数据就是读取文件的操作。文件有多种格式,即数据的组织形式。如何方便快捷的获取文件内容?还是那句名言,人生苦短,就用python吧。基本操作在python中,文件操作分为面向目录和面向文件,本质是一样的。常见的面向目录的操作如下表所示:常见的面向文件的操作如下表所示:在这些基本操作中,遍历一个目录并列出所有文件或需要的目标文件是一个常见的操作。另外需要注意的是,打开文件时的模式,a、w、r、a+、w+、r+组合时,这六种模式在读取二进制文件时必须加上b。在操作结束时,必须明确关闭文件。当然,通过with语句隐式关闭也是可以的。对于作为数据内容来源的文件来说,可以简单分为文本和非文本两种,即内容本身是文本和非文本。对于混合格式的文件,一般可以采用分治法。对于数据分析,它侧重于文件读取和数据收集。文本文件读取数据分析甚至文本分析都涉及文本文件的读取。文本文件也可以大致分为两类:纯内容文本和具有格式约定的文本。Purecontenttext是比较纯的文本数据,比如新闻、博客文本内容、readme等。Textwithformattingconventions是为了增强内容的功能性或实现特定的语义,如xml、html、json文件等。需要注意文本内容的字符集编码。为了确定一个文本文件属于哪个字符集,老编码员仍在使用chardet。不知道现在有没有更高级的方法。示例代码如下:importchardetf=open('/target_path/abel.txt',r)my_data=f.read()printchardet.detect(my_data)chardet.detect返回一个字典,包括编码类型和概率值.然后,您可以根据需要进行编码转换。与键值对相关的配置文件在应用程序中往往会有配置信息的.ini文件,可以通过python中的ConfigParser进行处理。ConfigParser模块具有三个对象:RawConfigParser、ConfigParser和SafeConfigParser。一般可以使用ConfigParser。一个应用配置文件“myweb_config.ini”如下:[myweb]url=http://%(host)s:%(port)s/mywebhost=192.168.1.100port=8888然后是使用ConfigParser的示例代码如下:importConfigParsermysql_config=ConfigParser.ConfigParser()cf.read("myweb_config.ini")printcf.get("portal","url")读取配置文件的一个常见用例是获取数据库的访问信息,以便可以从数据库中检索数据。Json、XML和HTML文件JSON是一种轻量级数据交换格式。Json文件以完全独立于编程语言的文本格式存储和表示数据。简洁明了的层次结构使JSON成为一种理想的数据交换语言,成为当前应用中的主流数据文件之一。通过Python的json模块,可以将字符串形式的json数据转换为字典,Python中的字典数据也可以转换为字符串形式的json数据。读取Json文件的示例代码如下:importjsonf=open("test.json",encoding='utf-8')my_json=json.load(f)然后就可以把my_json当作字典来读取了,需要main什么是设置Json文件的解码方式。XML是一组定义语义标记的规则,将文档划分为多个部分并标识这些部分。同时,它还定义了一种语法语言,用于定义其他领域特定的、语义的和结构化的标记语言。python中解析XML文件的方式有3种:SAX、DOM、ElementTree。ElementTree就像一个轻量级的DOM,示例代码如下:Web数据爬虫、数据分析、数据挖掘等都涉及到HTML文件的读写。在python中,使用BS4操作html非常方便。也可以对xml文件进行类似的操作,尤其是从网络上读取html。示例代码如下:importrequestsfrombs4importBeautifulSoupres=requests.get("http://a.b.c/c?d=e")soup=BeautifulSoup(res.text)printsoup.find_all('a')CSV文件CSV文件是一个文本文件用逗号分隔,使用比较广泛,尤其是excel文件另存为CSV文件,方便分析CSV文件中的数据。您可以使用csv模块在Python中进行操作。示例代码如下:importcsvcsv_reader=csv.reader(open('mydata.csv',encoding='utf-8'))foreach_lineincsv_reader:printeach_line常见的文本文件除了纯文本、键值对文件、json、xml之外、html和csv,里面有大量的日志文件。也可以选择相关库或者自己分析阅读,进一步进入NLP领域。媒体文件读取媒体文件中的数据内容一般不是文本,而是经过编码的数据,如图片、音频、视频文件等。为了简单起见,可能暂时不考虑字幕。图像文件图像由多种格式组成,即数据内容的编码和解码方式。在python中,PIL库一般用于读取或进一步处理图像文件。示例代码如下:fromPILimportImageim=Image.open('/home/abel/abc.jpg')w,h=im.sizeim.thumbnail((w/2,h/2))im.save('/home/abel/abc_thumbnail.jpg','jpeg')一个一个地获取图像文件缩略图的小例子。PIL非常强大,提供了几乎所有基本的图像操作,比如改变图像大小、旋转图像、图像格式转换、色域空间转换、图像增强、直方图处理、插值滤波等。当然还有一些其他的科学计算库还提供了很多图像处理功能,比如大名鼎鼎的OpenCV,具体可以参考文章《7行python代码的人脸识别》。音频MP3与图片文件一样,音频文件的编解码格式也有很多种。以MP3为例,只要了解MP3文件的编码格式,就可以直接通过Python读取MP3中的文件信息。如果不重新发明轮子,python也有很多音频的支持库。就MP3而言,可以使用python中的eye3D(http://http://eyed3.nicfit.net)库来读取MP3中的相关资料。示例代码如下:importeyed3f_mp3=eyed3.load("/users/hecom/xiangwang.mp3")printf_mp3.tag.titleprintf_mp3.info.time_secs技术发展日新月异。老编码员使用的PyMedia似乎已经很久没有维护了。至于mp3文件的播放,也有很多库可以使用,比如mp3play、pyaudio、pygame等。音频文件的进一步处理一般涉及到语音识别和语音合成。视频MP4视频大致可以看作是音频、图片甚至文字的混合体。要在Python中读取和处理视频文件,您通常可以使用MoviePy库(https://github.com/Zulko/moviepy)。MoviePy对于视频编辑(如剪切、合并、插入标题)、视频合成(又名非线性编辑)、视频处理或创建高级效果的基本操作很有用。它可以读写最常见的视频格式,包括GIF。示例代码如下:frommoviepy.editorimport*video=VideoFileClip("mybaby.mp4").subclip(50,60)txt_clip=(TextClip("MySon2002",fontsize=70,color='white').set_position('center').set_duration(10))result=CompositeVideoClip([video,txt_clip])result.write_videofile("mybaby_edited.mp4",fps=25)这个小例子是提取50秒到60秒之间的数据MP4并添加最后一点文本信息生成新的MP4文件。MoviePy提供了很多视频处理的方法和例子,可以和PIL、OpenCV、scikitImage、matplotlib等混合使用。另外,关于视频摄取,python中还有一个videocapture库。带格式代码的文档阅读另一种常见的文档,如PDF、word、excel等,也是一种混合文档,一般都是以文本为主,显示方式主要受规则限制。该文件包含有关显示格式的大量信息。当然,这些文件也可以嵌入媒体文件。简单解释一下,为了方便理解,可以将这些格式编码的文档看成是浏览器和html文本的结合体,这样文件中的一些逻辑处理就可以想象成JavaScript相关的操作。PDF文件PDF是一种非常有用的格式,可以解析和显示结合图片的文字,一般不可编辑。在Python中,一般可以使用pdfminer(http://www.unixuser.org/~euske/python/pdfminer/)或者pypdf来读取pdf文件中的内容。Thesamplecodegivenontheofficialwebsiteisasfollows:frompdfminer.pdfparserimportPDFParserfrompdfminer.pdfdocumentimportPDFDocumentfrompdfminer.pdfpageimportPDFPagefrompdfminer.pdfpageimportPDFTextExtractionNotAllowedfrompdfminer.pdfinterpimportPDFResourceManagerfrompdfminer.pdfinterpimportPDFPageInterpreterfrompdfminer.pdfdeviceimportPDFDevice#OpenaPDFfile.fp=open('mypdf.pdf','rb')#CreateaPDFparserobjectassociatedwiththefileobject.parser=PDFParser(fp)#CreateaPDFdocumentobjectthatstoresthedocumentstructure.#Supplythepasswordforinitialization.document=PDFDocument(parser,password)#Checkifthedocumentallowstextextraction.Ifnot,abort.ifnotdocument.is_extractable:raisePDFTextExtractionNotAllowed#CreateaPDFresourcemanagerobjectthatstoressharedresources.rsrcmgr=PDFResourceManager()#CreateaPDFdeviceobject.device=PDFDevice(rsrcmgr)#CreateaPDFinterpreterobject.interpreterageice)#Processeachpagecontainedinthedocument.forpageinPDFPage.create_pages(document):interpreter.process_page(page)另外也可以使用命令行---pdf2txt直接调用pdf文件进行文本转换word文件word文档几乎是最常见的officedocument,但是.docx文件的结构比较复杂,一般分为三层:Docment对象代表整个文档;Docment包含Paragraph对象的列表,Paragraph对象用于表示文档中的段落;一个Paragraph对象包含一个Run对象列表。在python中,一般可以使用python-docx库来读写word文件。简单起见,如果只关心word文件中的文本信息,示例代码如下:importdocxdoc=docx.Document('/home/abel/test.docx')paras=doc.paragraphstext_in_doc=[]foreach_pinparas:text_in_doc.append(each_p.text)PythonDocX目前是PythonOpenXML的一部分,可以用它打开Word2007及以后的文档,用它保存文档在MicrosoftOfficeOpensin2007/2010,MicrosoftMacOffice2008,GoogleDocs、OpenOffice和AppleiWork08.Excel文件python处理excel文件主要的第三方库有xlrd、xlwt、xluntils和pyExcelerator等,有人在它们之上封装了很多更方便实用的库。这里使用简单的xlrd(https://github.com/python-excel/xlrd/)读取excel文件。示例代码如下:importxlrdmyworkbook=xlrd.open_workbook('test.xls')#Openxlsfiletable=myworkbook.sheet_by_name(u'Sheet1')nrows=table.nrowsforiinrange(nrows):printtable.row_values(i)[:10]这个小例子读取test.xls文件并打印出Sheet1中每一行的前十列。xlrd受限,无法读取excel中的一些对象,如:图表、图片、宏等嵌入对象VBA、超链接、数据验证公式(结果除外)、条件格式、注释等,幸好我们关注的是数据内容在用于数据分析的excel中,这些限制是无害的。一句话总结文件数据源的读取是数据分析的切入点。Python可以用来快速方便地读取各种文件格式的内容,为进一步的数据分析或数据清洗提供一种简洁的方式。【本文来自专栏作家“老曹”原创文章,作者微信公众号:哦家ArchiSelf,id:wrieless-com】点此阅读更多本作者好文
