1

希望这将是我今天的最后一个问题:)

我有一个 csv 文件,其中包含很多行数据,例如:

{"first_name":"John","last_name":"Smith","age":30}
{"first_name":"Tim","last_name":"Johnson","age":34}

我正在使用此代码从文件中获取名字:

with open("c:\\newgood.csv", "r") as fo:
    for line in fo:
        match = re.search('first_name"(.*?)"(.*?)"', line)
        if match:
            results = match.group(2)
        else:
            print('None')
        print results

这有效,除非每次我遇到没有 first_name 的行时,它都会返回循环并且无法正确打印。例如,我在文件中的名字记录是:

John Tim Rob Lori Mel (no record) (no record) Carrie Trevor

当我使用上面的代码时,我得到:

John Tim Rob Lori Mel None Mel None Mel Carrie Trevor

如何更正上面的代码以遍历行并在没有 first_name 的地方打印 none 并且不会像它正在做的那样错误地循环返回?

我真的只需要知道如何让上面的代码正确地循环遍历行,而不是因为其他因素而尝试不同的方式。谢谢!

4

2 回答 2

3

您应该用做作来替换 else 中的 print 语句:

with open("c:\\newgood.csv", "r") as fo:
    for line in fo:
        match = re.search('first_name"(.*?)"(.*?)"', line)
        if match:
            results = match.group(2)
        else:
            results = 'None'
        print results

解释

使用您的代码,当没有找到名字时,您将打印“无”并且在您离开 else 块之后。正确的。但是随后,解释器打了print results一行,但对他来说,找到的最后一个结果是前一行,所以它重复了之前的结果,在你的情况下是Mel

因此,您需要在每个循环中更改结果,以确保仅打印名字或“无”字符串。

于 2013-08-25T21:31:45.887 回答
1

print results每次循环重复时执行。由于您只更改子句results中的值,因此if只要当前输入不包含名称,您就会看到重复的名称。

于 2013-08-25T21:33:37.230 回答