Python 检查CSV中每一行的条件

Python 检查CSV中每一行的条件,python,python-3.x,csv,Python,Python 3.x,Csv,假设我有这样一个示例csv文件: phonemes,graphemes W IY K D EY,w ee k d ay T EH K S T,t e x _ t Y UW,ewe _ SH UW T,chu te SH UW T,chu te SH UW T,chu te ! SX AH K,s u ck 我想检查每一行的具体情况。当我尝试遍历每一行时,当一行的元素满足条件时,我希望将计数器增加1,并继续检查下一行,而不是检查该特定行中的所有元素 我相信这类似于懒惰的评估?但我想不出一个办法来

假设我有这样一个示例csv文件:

phonemes,graphemes
W IY K D EY,w ee k d ay
T EH K S T,t e x _ t
Y UW,ewe _
SH UW T,chu te
SH UW T,chu te
SH UW T,chu te !
SX AH K,s u ck
我想检查每一行的具体情况。当我尝试遍历每一行时,当一行的元素满足条件时,我希望将计数器增加1,并继续检查下一行,而不是检查该特定行中的所有元素

我相信这类似于懒惰的评估?但我想不出一个办法来完成这项任务

我的评估代码:

for p, g in reader:
        phonemes = p.split()
        graphemes = g.split()
        if (len(phonemes) == len(graphemes) and
            all(p in valid_pset for p in phonemes) and
            all(g in valid_gset for g in graphemes)):

            valid_row += 1
            p_count += len(phonemes)
            g_count += len(graphemes)
        else:
            invalid_row += 1
因此,使用此代码,它将在一行中计算每个元素,每次它满足要求时,我的
有效行
无效行
将增加1

这不是我想要做的。。。 我想知道有没有一种方法可以让我简单地计算、递增,然后转到下一行继续做同样的事情,直到文件结束

编辑:当检查它是否有效时,我需要该行中的所有元素满足正确的要求。有什么简洁的方法可以做到这一点(通过检查一行中的所有字符是否有效,将有效计数器增加1

编辑:我想当我碰到一个无效字符时,我可以增加计数器,从内部循环中断,到达下一行,然后重新进入循环?还是有更快的方法

编辑:

AA AE 啊 敖 哦 嗯 B 中国 D DH 嗯 急诊室 安永 F G 嗯 IH 艾伊 JH K L M N NG 噢 哦 P R s 嘘 T 真实航向 UH 华盛顿大学 v W Y Z ZH

这是一个包含所有有效音素的文本文件。(我已经将其添加到有效的_pset中)

有效的图示如下:(添加到有效的集合)

例如,在检查示例文件时。无效行应为4 但我的代码没有做到这一点

编辑:似乎我已经找到了一种方法。但是最后一件让我无法得到正确答案的事情是,如何检查文本文件中一行中的每个元素?更具体地说:


对于
ee
我想检查这个“单词”中的两个“e”是否都在有效的_集合中。意思是只要两个单独的“e”都在集合中,那么
ee
就应该有效。有什么帮助吗?

编辑我根据您对OP所做的更改修改了代码:

我运行了这段代码,它似乎起作用了。它给了我一行有效的解释:

import csv

valid_pset = set("""
    AA AE AH AO AW AY B CH D DH EH ER EY F G HH IH IY
    JH K L M N NG OW OY P R S SH T TH UH UW V W Y Z ZH
    """.strip().split())
valid_gset = set("abcdefghijklmnopqrstuvwxyz_")

valid_row = 0
invalid_row = 0
p_count = 0
g_count = 0

with open('test.csv','r') as f:
    reader = csv.reader(f)
    # Skip headers
    next(reader)
    try:
        line = 1
        for p,g in reader:
            phonemes = p.split()
            graphemes = g.split()
            line += 1

            valid = True
            if len(phonemes) != len(graphemes):
                print("Line {}: Number of phonemes and graphemes differ.".format(line))
                valid = False

            bad_p = [p for p in phonemes if p not in valid_pset]
            if bad_p:
                print("Line {}: Invalid phonemes {}".format(line, bad_p))
                valid = False

            graphemes = list(''.join(graphemes))
            bad_g = [g for g in graphemes if g not in valid_gset]
            if bad_g:
                print("Line {}: Invalid graphemes {}".format(line, bad_g))
                valid = False

            if valid:
                valid_row += 1
                p_count += len(phonemes)
                g_count += len(graphemes)
            else:
                invalid_row += 1
    except ValueError:
        pass

print("Valid rows: {}, Invalid rows: {}, p_count: {}, g_count: {}".format(
    valid_row, invalid_row, p_count, g_count))
以下是我得到的输出:

$ python test.py
Line 5: Number of phonemes and graphemes differ.
Line 6: Number of phonemes and graphemes differ.
Line 7: Invalid graphemes ['!']
Line 8: Invalid phonemes ['SX']
Valid rows: 3, Invalid rows: 4, p_count: 12, g_count: 16

看起来你所拥有的应该是你想要它做的。你能澄清一下你认为错误的地方吗?你检查的是什么情况
all()
短路和
短路,因此,如果任何条件为假,它将立即下降到
其他
。我将编辑问题,抱歉混淆。抱歉混淆。有效的_集应该是预设的,我在上面添加了。我希望validrow的答案应该是4I编辑我的代码以说明您提供的数据。这与我的想法非常接近。我还编辑了“ee”应该有效的条件,因为“e”和“e”都在有效集合中。“ay”和其他类似的词也一样。谢谢,抱歉打扰了。这些字母只是拼写的输入单词吗?如果是这样,您可能应该将它们连接在一起,然后将它们转换回一个列表。我添加了这一行
graphemes=list('''.join(graphemes))
以将这些graphemes折叠回字母。
$ python test.py
Line 5: Number of phonemes and graphemes differ.
Line 6: Number of phonemes and graphemes differ.
Line 7: Invalid graphemes ['!']
Line 8: Invalid phonemes ['SX']
Valid rows: 3, Invalid rows: 4, p_count: 12, g_count: 16