搜索具有相同字符串的文件时出现键盘错误。

Keyerror when searching through file with same strings.

您好,我在搜索具有多个序列号的大文件时遇到 KeyError。当我搜索文件并输入在文件中出现两次的序列号时,就会出现此问题。我想搜索这个文本文件并打印出我需要的序列号或用户输入的序列号。

这是错误:

    if item[param] != correct:
KeyError: 'APN'

这是我正在搜索的文件的文本示例:

500,SHOWALL
APN=" "
APU=" "
APP=" "
IPD="127.0.0.1"
DSP=1710
IPU="127.0.0.1"
VWD="2"

600,SHOWALL
APN=""
APU=" "
APP=" "
IPD="127.0.0.1"
DSP=1710
IPU="127.0.0.1"
VWD="2"

700,SHOWALL
APN=" "
APU=" "
APP=" "
IPD="127.0.0.1"
DSP=1710
IPU="127.0.0.1"
VWD="2"

500,SHOWALL
APN=""
APU=" "
APP=" "
IPD="127.0.0.1"
DSP=1710
IPU="127.0.0.1"
VWD="2"

由于 500 在文件中出现两次,因此 运行 会出现 KeyError。

这是我的代码示例:

def process(infile, outfile, keywords):

    keys = [[k[0], k[1], 0] for k in keywords ]
    endk = None
    with open(infile, "rb") as fdin:
        with open(outfile, "ab") as fdout:
            fdout.write("<" + words + ">" + "\n")
            for line in fdin:
                if endk is not None:
                    fdout.write(line)
                    if line.find(endk) >= 0:
                        fdout.write("\n")
                        endk = None
                else:
                    for k in keys:
                        index = line.find(k[0])
                        if index >= 0:
                            fdout.write(line[index + len(k[0]):].lstrip())
                            endk = k[1]
                            k[2] += 1
    if endk is not None:
        raise Exception(endk + " not found before end of file")
    return keys

这是我用于输入文件、输出文件和搜索文件的关键字的定义过程。这是代码的输出部分:

while (count < (len(setNames))):
    for number, item in enumerate(lst, 0):
        print setNames[count]
        for param, correct in correct_parameters.items():
            if item[param] != correct:
                print('{} = {} which is incorrect'.format(param, item[param]))
                with open(compareResults, "ab") as fdout:
                    fdout.write('{}'.format(setNames[count]) + " " + '{} = {} which is incorrect'.format(param, item[param])+ '\n')
        count += 1

我的目标是如果序列号出现两次或更多次,如何让程序输出结果两次。因此,即使 500 在我的文本文件中出现两次或更多次。我仍然希望它打印正确的所有 500 个结果。

这是我的完整代码的 link。我没有 post 完整的东西,因为它非常复杂,需要先做一些清理工作。

http://pastebin.com/aCe9N8vW

如果需要更多信息,我会在下面 post。

你可以这样试试,

if item.get(param) != correct:

按键错误:

Raised when a mapping (dictionary) key is not found in the set of existing keys.

如果不想出现异常,可以使用get()方法

听起来您并没有预料到会发生 KeyError。如果是这种情况,那么使用 item.get() 可能只会隐藏错误。考虑使用 try/except:

try:
    if item[param] != correct:
        report_incorrect()
except KeyError:
    print('Expected key {}'.format(param))

真的,您应该返回查看代码并确定密钥不存在的原因。

我试图查看您提供的 link,但代码组织得不够好,我无法轻松阅读。在顶部提供一些关于它应该做什么的评论会有所帮助。例如,

"""This code reads an input log file and a configuration file.
For each serial number in the configuration file, it outputs how
many times it occurs in the log file.
"""

此外,将更多内容组织到函数中可能会有所帮助,也许 类,再次对每个函数的目标进行评论。也许当清理代码时,问题就会消失。