Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找无法容纳内存的大文件中出现的字符串_Python_Bigdata - Fatal编程技术网

Python 查找无法容纳内存的大文件中出现的字符串

Python 查找无法容纳内存的大文件中出现的字符串,python,bigdata,Python,Bigdata,我被要求在一个10GB大、1GB内存的大文件中查找字符串“And”的出现次数。我将如何有效地完成它。我回答说,我们需要读取每个100MB内存块中的文件,然后找到每个内存块中出现的“and”的总数,并保留字符串“and”的累积计数。面试官对我的回答不满意,他告诉我grep命令在unix中是如何工作的。写一个类似于python的代码,但我不知道答案。我将非常感谢您回答这个问题。如果您使用,您可以访问一个大文件并进行处理 简单的grep命令 def command(f): def g(file

我被要求在一个10GB大、1GB内存的大文件中查找字符串“And”的出现次数。我将如何有效地完成它。我回答说,我们需要读取每个100MB内存块中的文件,然后找到每个内存块中出现的“and”的总数,并保留字符串“and”的累积计数。面试官对我的回答不满意,他告诉我grep命令在unix中是如何工作的。写一个类似于python的代码,但我不知道答案。我将非常感谢您回答这个问题。

如果您使用,您可以访问一个大文件并进行处理

简单的grep命令

def command(f):
    def g(filenames, **kwa):
        lines = readfiles(filenames)
        lines = (outline for line in lines for outline in f(line, **kwa))
        # lines = (line for line in lines if line is not None)
        printlines(lines)
    return g

def readfiles(filenames):
    for f in filenames:
        for line in open(f):
            yield line


def printlines(lines):
    for line in lines:
            print line.strip("\n")

@command
def grep(line, pattern):
    if pattern in line:
        yield line


if __name__ == '__main__':
    import sys
    pattern = sys.argv[1]
    filenames = sys.argv[2:]
    grep(filenames, pattern=pattern)

迭代文件,返回行。在这种情况下,这很容易,因为搜索字符串不包含行尾字符,所以我们不需要担心跨行的匹配

with open("file.txt") as fin:
    print sum(line.count('And') for line in fin)
在每行使用
str.count

>>> help(str.count) Help on method_descriptor: count(...) S.count(sub[, start[, end]]) -> int Return the number of non-overlapping occurrences of substring sub in string S[start:end]. Optional arguments start and end are interpreted as in slice notation. >>>帮助(str.count) 有关方法\u描述符的帮助: 计数(…) S.count(sub[,start[,end]])->int 返回子字符串sub在中不重叠的出现次数 字符串S[开始:结束]。解释可选参数start和end 如切片表示法。
可能会有帮助。如果你不是逐行阅读,别忘了检查边界