用Python中的readline()和readlines()函数以及for循环逐行读取文件

您所在的位置:网站首页 python中read和readline的区别 用Python中的readline()和readlines()函数以及for循环逐行读取文件

用Python中的readline()和readlines()函数以及for循环逐行读取文件

2023-03-25 17:30| 来源: 网络整理| 查看: 265

编程中的常见任务是打开文件并解析其内容。当您要处理的文件非常大,例如几 GB 或更大时,您该怎么办?解决这个问题的方法是一次读取文件的块,处理它,然后从内存中释放它,以便您可以处理另一个块,直到整个大文件被处理。虽然您需要确定正在处理的数据块的合适大小,但对于许多应用程序,一次处理一个文件的一行是适当的。

在本文中,我们将涵盖一些代码示例,演示如何逐行读取文件。如果您想自己尝试这些示例中的一些,可以在以下 GitHub 存储库中找到本文中使用的代码。

Python 中的基本文件 IO

Python 是一种非常有用的通用编程语言,其标准库中具有多种非常有用的文件 IO 功能。

内置的 open() 函数是您用于打开读取或写入目的的 文件对象 的函数。以下是如何使用它打开文件:

资讯 - 互联网IT技术应用资讯 - 桑鸟网

fp = open('path/to/file.txt', 'r')

如上所示open()函数接受多个参数。我们将专注于两个参数,第一个是代表要打开的文件的路径的位置字符串参数。第二个(可选)参数也是字符串,它指定您打算在函数调用返回的文件对象上使用的交互模式。最常见的模式列在下表中,其中默认值为r:

模式 描述 r 以纯文本模式打开进行读取 w 以纯文本模式打开进行写入 a 以纯文本模式打开现有文件进行追加 rb 以二进制模式打开进行读取 wb 以二进制模式打开进行写入

一旦您已经写入或读取了文件对象中的所有所需数据,就需要关闭文件,以便可以在代码正在运行的操作系统上重新分配资源。

fp.close()

注意:关闭文件对象资源是一个总是好的做法,但易于忘记的任务。

虽然您始终可以记住在文件对象上调用 close(),但有一个替代且更优雅的方法来打开文件对象并确保 Python 解释器在其使用后清理:

with open('path/to/file.txt') as fp: # 用fp做些什么...

通过简单地使用with关键字(在 Python 2.5 中引入)将我们用于打开文件对象的代码添加到该代码中,Python 将执行类似以下代码的操作。这确保了无论文件对象是什么,都会在使用后关闭:

try: fp = open('path/to/file.txt') # 用fp做些什么... finally: fp.close()

这两种方法都是合适的,第一个示例更为 Pythonic。

从 open() 函数返回的文件对象具有三种常见的显式方法(read()、readline() 和 readlines())来读取数据。read() 方法将所有数据读入单个字符串中。对于您想对整个文件进行文本操作的较小文件,这非常有用。然后是 readline(),它是一种有用的方式,可以仅以增量方式读取单个行,并将其作为字符串返回。最后一个显式方法 readlines() 将读取文件的所有行并将它们作为字符串列表返回。

让我们从 readline() 方法开始,它读取一行,这将要求我们使用计数器并对其进行递增:

filepath = 'Iliad.txt' with open(filepath) as fp: line = fp.readline() cnt = 1 while line: print("Line {}: {}".format(cnt, line.strip())) line = fp.readline() cnt += 1

此代码片段打开了一个文件对象,其引用存储在 fp 中,然后通过在 while 循环中迭代调用该文件对象上的 readline() 一次读取一行。然后,它只是将该行打印到控制台。

运行此代码,您应该看到类似以下的内容:

... Line 567: 极其微不足道。我们没有剩余的比公元前更早的铭文。 Line 568: 第40届奥林匹亚运动会,早期的铭文是粗略的、不熟练的。 Line 569: 我们甚至不能保证阿基洛科斯、西蒙尼德等人是否会被处决。 Line 570: 阿莫尔古斯、卡利努斯、泰尔泰斯、桑图斯以及其他早期的挽歌和诗歌。 Line 571: 抒情诗人,把他们的作品写成文字,或者在什么时候? Line 572: 这样做的实践变得很熟悉。第一个积极的理由是 Line 573: 授权我们推测荷马手稿的存在,是在 Line 574: 索伦的著名法令,关于在 Line 575: Panathenaea:但之前的手稿有多长的时间呢? Line 576: 存在,我们不能说。 ...

虽然此方法很粗糙而且显式,不太 Pythonic。我们可以利用 readlines() 方法使此代码更加简洁。

sangniao.com

使用readlines()逐行读取文件

readlines() 方法读取所有行并将它们存储到 List 中。然后,我们可以遍历该列表并使用 enumerate() 为我们方便地为每行创建一个索引:

file = open('Iliad.txt', 'r') lines = file.readlines() for index, line in enumerate(lines): print("Line {}: {}".format(index, line.strip())) file.close()

这将导致:

... Line 160: 引言 Line 161: Line 162: Line 163: 怀疑主义是知识的结果,正如知识是知识的结果一样。 Line 164: 怀疑主义。满足于我们目前所知道的,在大多数情况下是 Line 165: 部分,闭上我们的耳朵不听劝告;因为,从一开始就 Line 166: 我们的教育的特点,我们必须不断地忘记,并解放 Line 167: 我们必须把以前获得的知识放在一边。 Line 168: 观念和接受新的观念;而且,在我们学习的过程中,我们必须每日 Line 169: 我们花了不小的力气和焦虑才学会的东西。 Line 170: 获得。 ...

现在,尽管更好,但我们甚至不需要调用 readlines() 方法即可实现此相同的功能。这是传统的逐行读取文件的方式,但有一种更现代、更简短的方式。

使用 for 循环逐行读取文件 - 最 Pythonic 的方法

返回的 File 本身是可迭代的。我们根本不需要通过 readlines() 提取行 - 我们可以直接迭代返回的对象。这也使得我们可以轻松地使用 enumerate(),以便在每个 print() 语句中写入行号。

应用程序 - 程序员的软件应用工具箱 - 鸟网

这是解决问题的最短、最 Pythonic 的方法,并且是大多数人喜欢的方法:

with open('Iliad.txt') as f: for index, line in enumerate(f): print("Line {}: {}".format(index, line.strip()))

这将导致:

... Line 277: 来自Leucadia的Mentes,也就是现代的Santa Maura,他表现出一种知识和经验。 Line 278: 在那个时代很少见的智慧,劝说Melesigenes关闭 Line 279: 他的学校,并陪同他旅行。他承诺不仅要支付 Line 280: 他的费用,但要为他提供进一步的津贴,并敦促,。 Line 281: "当他还年轻的时候,他应该亲眼看到 Line 282: 在他的眼里,今后可能成为他的臣民的国家和城市。 Line 283: 说话"。Melesigenes同意了,并与他的赞助人一起出发。 Line 284: "研究他们所访问的国家的所有奇闻异事,以及 ...

在这里,我们利用了 Python 的内置功能,使我们可以轻松地迭代可迭代对象,只需使用 for 循环即可。如果您想阅读有关 Python 内置在对象上迭代的功能的更多信息,我们为您提供了帮助:

Python的itertools模块count()、cycle()和chain()的示例教程

Python的迭代工具:filter()、islice()、map()和zip()

逐行阅读文件的应用

您如何实际使用它?大多数 NLP 应用都处理大型数据语料库。大多数情况下,将整个语料库读入内存是不明智的。虽然简陋,但您可以编写一个从头开始的解决方案,以计算特定单词的频率,而不使用任何外部库。

让我们编写一个简单的脚本,它加载一个文件,逐行读取它,并计算单词的频率,打印出出现次数最多的前 10 个单词及其数量:

import sys import os def main(): filepath = sys.argv[1] if not os.path.isfile(filepath): print("File path {} does not exist. Exiting...".format(filepath)) sys.exit() bag_of_words = {} with open(filepath) as fp: for line in fp: record_word_cnt(line.strip().split(' '), bag_of_words) sorted_words = order_bag_of_words(bag_of_words, desc=True) print("Most frequent 10 words {}".format(sorted_words[:10])) def order_bag_of_words(bag_of_words, desc=False): words = [(word, cnt) for word, cnt in bag_of_words.items()] return sorted(words, key=lambda x: x[1], reverse=desc) def record_word_cnt(words, bag_of_words): for word in words: if word != '': if word.lower() in bag_of_words: bag_of_words[word.lower()] += 1 else: bag_of_words[word.lower()] = 1 if __name__ == '__main__': main()

该脚本使用os模块来确保我们尝试读取的文件确实存在。如果存在,则逐行读取文件并将每行传递到record_word_cnt()函数中。它会限定单词之间的空格并将单词添加到字典-bag_of_words中。一旦所有行都记录到字典中,我们将通过order_bag_of_words()进行排序,该函数以(word, word_count)格式返回按单词计数排序的元组列表。

最后,我们打印出最常用的十个单词。

通常,为此,您会使用像NLTK这样的库创建一个词袋模型,但是,此实现就足够了。让我们运行脚本并将我们的Iliad.txt提供给它:

$ python app.py Iliad.txt

结果为:

Most frequent 10 words [('the', 15633), ('and', 6959), ('of', 5237), ('to', 4449), ('his', 3440), ('in', 3158), ('with', 2445), ('a', 2297), ('he', 1635), ('from', 1418)] 结论

在本文中,我们探讨了在Python中逐行读取文件的多种方法,以及创建了一个基本的词袋模型来计算给定文件中单词的频率。

版权声明:本文为桑鸟网博主「yesho」的原创文章,转载请附上原文出处链接及本声明。

本文标题:用Python中的readline()和readlines()函数以及for循环逐行读取文件

本文地址:https://news.sangniao.com/p/1277872220



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3