如何迭代一个包含大量行的文件来查找字符串?

时间:2017-11-14 06:48:58

标签: python python-2.7 python-3.x

的Python:

我有一个特定的词,我在一个大尺寸的文本文件中查找数百万条记录。

所以实际上我想搜索文件中是否有特定的字符串。

我做的一种方式是:

with open('ip.log', 'r') as f:
     for line in f:
         if semething in line:
            break
     else: 
         print 'Not found'

但是对于小文件,这个过程会很好,但是当文件大小增加或记录增长到数千万时。将大文件放入内存可能不是一个可行的解决方案。

有没有更好的方法来解决这个问题?

观察:

  1. 如果文件是1GB或更大的文件,它会使系统变慢
  2. 寻找一个文本,我们每次需要迭代数百万条记录。

2 个答案:

答案 0 :(得分:1)

您的担忧是没有根据的:您的代码不会将整个文件加载到内存中 - 试试吧!一旦找到您搜索的单词,循环中的dyld: Library not loaded: @rpath/StarscreamSocketIO.framework/StarscreamSocketIO Referenced from: /private/var/containers/Bundle/Application/69ADA4FD-59A0-4840-9A64-XXXXX/XXXX.app/Frameworks/SocketIO.framework/SocketIO Reason: image not found 就会停止读取该文件,因此也不用担心。

在您的代码中,break是一个文件对象,当与f循环一起使用时,它一次读取一行。如果您已写入forf.readlines()然后,您将阅读整个文件。

唯一可能的问题是,如果您的文件不包含换行符(例如,如果它们是二进制文件,或者是由空格而不是换行符分隔的大量单词列表)。在这种情况下,您需要使用f.read()之类的内容来读取字符块(并处理跨块的单词)。由于您的用例涉及常规文本文件,因此无需担心。

答案 1 :(得分:0)

使用with open('ip.log', 'r') as f: if any(line for line in f if something in line): break else: print 'Not found' 功能。它将在第一个匹配时停止,并且不会将整个文件加载到内存中。这非常有效。

driver