📜  如何在Python中读取大文本文件?

📅  最后修改于: 2022-05-13 01:54:47.088000             🧑  作者: Mango

如何在Python中读取大文本文件?

Python是一种开源的动态类型和解释型编程语言。读写文件是编程的一个组成部分。在Python中,使用readlines()方法读取文件。 readlines() 方法返回一个列表,其中列表中的每一项都是文件中的一个完整句子。当文件较小时,此方法很有用。由于 readlines() 方法将每一行附加到列表中,然后返回整个列表,如果文件大小非常大(以 GB 为单位),这将是耗时的。此外,该列表将消耗大量内存,如果没有足够的内存可用,这可能会导致内存泄漏。为了避免这个问题,我们可以使用文件对象作为迭代器来迭代文件并执行所需的任务。由于迭代器只是遍历整个文件,不需要任何额外的数据结构来存储数据,因此消耗的内存相对较少。此外,迭代器不执行像追加这样的昂贵操作,因此它也很省时。文件在Python中是可迭代的,因此建议使用迭代器。

以下两个程序演示了如何使用Python读取大型文本文件。

方法一:

第一种方法使用迭代器来迭代文件。在这种技术中,我们使用Python中的fileinput模块。 fileinput 模块的 input() 方法可用于读取文件。与 readlines() 相比,使用此方法的优点是 fileinput.input() 不会将整个文件加载到内存中。因此,没有内存泄漏的可能性。 fileinput.input() 方法接受一个文件名列表,如果没有传递参数,它接受来自标准输入的输入。该方法返回一个迭代器,该迭代器从正在扫描的文本文件中返回单个行。

代码实现:

Python3
# import module
import fileinput
import time
  
#time at the start of program is noted
start = time.time()
  
#keeps a track of number of lines in the file
count = 0
for lines in fileinput.input(['sample.txt']):
    print(lines)
    count = count + 1
      
#time at the end of program execution is noted
end = time.time()
  
#total time taken to print the file
print("Execution time in seconds: ",(end - start))
print("No. of lines printed: ",count)


Python3
import time
  
start = time.time()
count = 0
with open("sample.txt") as file:
    for line in file:
       print(line)
       count = count + 1
end =  time.time()
print("Execution time in seconds: ",(end-start))
print("No of lines printed: ",count)


输出:

解释:

input() 方法返回一个迭代器,它扫描整个文件并打印每一行。

方法二:

第二种方法也使用迭代器来读取文件。唯一的区别是我们将使用文件对象的迭代器。使用的方法是 open() 将整个文件包装成一个文件对象。接下来,我们使用迭代器来获取文件对象中的行。我们在“with”块中打开文件,因为它会在整个块执行时自动关闭文件。随着 with 块完成, __exit__() 方法被调用,该方法释放任何打开的资源。

代码实现:

蟒蛇3

import time
  
start = time.time()
count = 0
with open("sample.txt") as file:
    for line in file:
       print(line)
       count = count + 1
end =  time.time()
print("Execution time in seconds: ",(end-start))
print("No of lines printed: ",count)

输出:

解释:

这种方法所需的时间相对较少。这个程序也可以在没有块的情况下编写,但在这种情况下,我们必须确保明确关闭文件资源。