更快地从大文件中读取字符串

时间:2015-12-30 17:21:30

标签: python string file file-io

我有一个大文本文件(parsed.txt),其中包含近1.500.000行。每一行都采用以下格式:

foobar foo[Noun]+lAr[A3pl]+[Pnon]+[Nom]
loremipsum lorem[A1sg]+lAr[A3pl]+[Pl]+[Nom]

我在空格后给出第二个字段,并使用此函数获取空格前的第一个字段:

def find_postag(word,postag):
    with open('parsed.txt',"r") as zemberek:    
        for line in zemberek:
            if all(i in line for i in (word,postag)):
                if line.split(" ")[0].startswith(word) and line.split(" ")[1] == word+postag:
                    selectedword = line.split(" ")[0]
                    break
        return selectedword

然而,它的工作太慢了。我不知道如何才能让这个过程更快。我的想法是:parsed.txt文件按字母顺序排列。如果给定word变量以“z”字母开头,则它不必要地读取近900.000行。如果给定的word以“z”字母开头,如果从900.000行检查它可能会更快。有没有更好的想法,我该如何实施?

1 个答案:

答案 0 :(得分:1)

由于您的输入文件是按字母顺序排列的,您可以创建一个包含每个字母开头的行号的字典,如下所示:

with open('parsed.txt', 'r') as f:
    data = [line.strip() for line in f if line.strip()]

index = dict()
for i in range(len(data)):
    line = data[i]
    first_letter = line[0].lower()
    if first_letter not in index:
        index[first_letter] = i

您可能希望在开头添加该代码,因此它只会在您开始搜索之前运行一次。这样,当您搜索单词时,您可以让它开始搜索其首字母开头的位置,如下所示:

def find_postag(word, postag):
    start = index[word[0].lower()]
    for line in data[start:]:
        # your code here
        if all(i in line for i in (word,postag)):
            if line.split(" ")[0].startswith(word) and line.split(" ")[1] == word+postag:
                selectedword = line.split(" ")[0]
                break
    return selectedword