检查CSV中每行的条件

时间:2016-05-02 03:19:39

标签: 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并继续检查下一行,而不是检查该特定行中的所有元素。

我相信这类似于懒惰的评价?但我无法找到完成这项任务的方法。

我的评估代码:

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

因此,使用此代码,它会在一行中评估每个元素,并且每次满足要求时,valid_rowinvalid_row将增加 1

这不是我打算做的...... 我想知道有没有一种方法可以简单地评估,增加,然后转到下一行继续做同样的事情,直到文件结束?

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

编辑:我想当我遇到一个无效字符时,我可以递增计数器并从内部循环中断并进入下一行然后重新进入循环?或者有更快的方法吗?

编辑:

  

AA   AE   啊   AO   AW   AY   乙   CH   d   DH   EH   ER   EY   F   G   HH   IH   IY   JH   ķ   大号   中号   ñ   NG   OW   OY   P   [R   小号   SH   Ť   TH   UH   UW   V   w ^   ÿ   ž   ZH

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

有效的字形是:(添加到valid_pset)

valid_graphemes = 
{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 
 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '_'})

因此,例如在检查示例文件时。无效行应为 4 但是我的代码没有这样做。

编辑:好像我可能找到了办法来做到这一点。但最后一件让我无法得到正确答案的是,如何检查文本文件中某一行中的每个元素?更具体地说:

对于ee我想同时检查" e"在这个"字"在valid_set中。只要单个" e"在集合中,ee应该有效。对此有何帮助?

1 个答案:

答案 0 :(得分:1)

编辑我修改了您对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