Python 检查CSV中每一行的条件
假设我有这样一个示例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,并继续检查下一行,而不是检查该特定行中的所有元素 我相信这类似于懒惰的评估?但我想不出一个办法来
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