10GB の 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 の重複しない出現回数を返します 文字列 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 に答える