7.1.4 文件的读取
当文件被打开后,根据打开方式的不同可以对文件进行相应的读写操作。当文件以文本文件方式打开时,读写按照字符串方式,采用当前计算机使用的编码或指定的编码。当文件以二进制文件方式打开时,读写按照字节流方式。Python提供了3个常用的文件内容读取方式,如表7-2所示。
表7-2 文件内容读取方式
将文件中的内容读出来,并打印。
方法一:一次读入,统一处理。
使用read()函数,不给参数,则表示读取整个文档的内容,并将读取内容作为一个字符串返回。例如,要读取同目录中的文本文件poem.txt,一次读取的代码如下:
运行结果如下:
注意:在读文件内容时,碰到文件中换行的位置,会读取到换行符“\n”,当使用print打印时,会把“\n”当作换行打印。所以上面代码输出来,虽然读取时得到的是一个整的字符串,但是输出时会出现换行。
read()方法的缺点在于:当读入文件非常大时,一次性将内容读取到列表中会占用很多内存,影响程序执行速度。
方法二:按量读入,逐步处理。
使用read(n),给出参数,参数值表示要读取字符的个数。如果要读完整个文档,需要跟循环相结合。例如,要读取同目录中的文本文件poem.txt,每次读9个字符,实现代码如下:
运行结果:
方法三:一次读入,分行处理。
使用readlines()方法会按行读取文件中的内容,返回类型为列表,每一行为列表中的一个元素。如果不给参数,则读完整个文档。如果要输出文档中的内容,则用遍历列表的方式进行输出。代码如下:
运行结果:
注意:使用readlines()方法读取的结果是一个列表。文件中的一行为列表中的一个元素。因而想输出所有内容,需要对列表进行遍历。
方法四:分行读入,逐行处理。
使用readlines(n)方法时,给出了参数n,表示一次读n行,返回值为列表,每行为列表中的一个元素。例如,读poem.txt中的内容时,一次只读一行的代码如下:
运行结果:
拓展:
除了使用open()方法外,还可以使用“with open()as变量名”这种方法。
使用with语句的好处就是到达语句末尾时会自动关闭文件,即使出现异常也会自动关闭文件。
运行结果:
【案例7-1】 文件读取举例:词频统计,以Hamlet为例。
在现实中常常会遇到这样的问题,一篇文章需要统计多次出现的词语,从而分析文章内容。在对网络信息进行自动检索和归档时,也会遇到这样的问题。
词频统计的本质就是词语数量的累加问题,对每一个词语设计一个计数器,每出现1次,相应的计数器就加1。因为一篇文章中的词语量比较大,为避免词语计数器发生混乱,可以将词语与相应的计数器组成键值对。
《哈姆雷特》代表着整个西方文艺复兴时期文学的最高成就,很多国内外的电影都是以此为原型的。
先获取《哈姆雷特》的文章内容,以hamlet.txt文本文件保存,该书可以在网络上找到并下载。
第一步,获取英文文本。内容存储在文本文件中,此处需要用到本章的文件打开与读取方法。打开文件:open(文件名,打开方式)。读取全文:read()。
第二步,统一大小写。由于同一个单词会存在大小写不同的形式,但计数时不应该区分大小写,将它们归为一个单词。统一转换为小写:lower()。
第三步,去掉标点符号。标点符号不参与计数,为避免标点符号对分词造成影响,需要将原文中的各类标点符号用replace()方法替换成空格。
第四步,提取单词。利用相应的方法将单词进行分解并提取,英文文本以空格或标点符号来分隔词语,获得单词并统计数量相对容易。统一用空格来分离单词:split()。
第五步,创建字典,用于存储词语及对应的计数器。
第六步,遍历文本,对计数器值进行修改。计数器值的变化就是对值进行修改,而修改是指在原有的基础上加1,则可以使用字典的“d.get(key,default)+1”方式来实现,如果词语在字典中存在,则获得原有值,在这个值的基础上进行修改,如果这个词语不存在,则将它的默认值设为0,表示第一次出现。
第七步,字典转换为列表,按词频排序。由于字典是无序的,因此想要显示词频最高的词语,需要先将其转换为序类型,才能实现排序。转换函数为list(),排序函数为sort(),字典转换为列表会是一个二元关系,即二维列表,排序需要使用key属性,使用lambda()函数指定排序的依据。
第八步,遍历列表,输出词语及词频。按需要将前10个高频词及次数输出。
运行结果:
从运行结果可以看出,高频词语大多是冠词、代词、连接词等语法型词汇,并不能代表文章的含义。想要优化程序,可以采用集合类型构建一个排除词汇库excludes,在输出结果中将这个词库中的内容先排除掉。在原有的程序上添加代码,修改如下:
运行结果:
修改后的运行结果还是存在很多语法词汇,如果希望排除更多,可以在集合中继续增加内容,感兴趣的读者可以进一步完善该功能。