检查CSV中每行的条件

2024-10-02 08:19:18 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样一个示例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 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

这是一个包含所有有效音素的文本文件

有效的graphemes是:(添加到有效的\u 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,我想检查这个“word”中的“e”是否在有效的\u集中。意思是只要两个“e”都在集合中,那么ee应该是有效的。有什么帮助吗?你知道吗


Tags: 文件in元素编辑lensh计数器ee
1条回答
网友
1楼 · 发布于 2024-10-02 08:19:18

编辑我根据您对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

相关问题 更多 >

    热门问题