我被要求在一个 10GB 大且有 1GB RAM 的大文件中查找字符串“And”的出现次数。我将如何有效地做到这一点。我回答说我们需要在每个 100MB 的内存块中读取文件,然后找到每个内存块中“And”的总出现次数,并保持字符串“And”的累积计数。面试官对我的回答不满意,他告诉我 grep 命令在 unix 中是如何工作的。在 python 中编写类似的代码,但我不知道答案。我会很感激这个问题的答案。
问问题
2834 次
2 回答
5
遍历文件,返回行。在这种情况下很容易,因为搜索字符串不包含行尾字符,所以我们不需要担心匹配跨行。
with open("file.txt") as fin:
print sum(line.count('And') for line in fin)
str.count
在每一行上使用
>>> 帮助(str.count) 关于method_descriptor的帮助: 数数(...) S.count(sub[, start[, end]]) -> int 返回子字符串 sub in 的非重叠出现次数 字符串 S[开始:结束]。可选参数 start 和 end 被解释 与切片表示法一样。
于 2013-07-23T05:35:51.217 回答
4
如果您使用生成器,您可以访问一个大文件并进行处理。
简单的 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)
于 2013-07-23T05:30:55.900 回答