我有一个以下格式的csv文件作为示例,正如您所看到的,它可能有一条或两条消息,
Sara,27,Message1,Message2
Joe,21,Message3
我把我的读者写如下,Sara有两条消息,它很好用,但Joe有一条消息,代码就不会运行了。你介意帮我看看吗?
reader = csv.reader(f)
try:
for row in reader:
name=row[0]
age=row[1]
MSG1=row[2]
MSG2=row[3]
#for row[2]
if MSG1=='Message1':
print("A")
if MSG1=='Message3':
print("B")
#for row[3]
if MSG2=='Message2':
print("C")
except IndexError:
pass
以上代码结果:
AB
预期结果:
AB
C
您可以使用Extended Iterable Unpacking,对于检查条件,您可以使用类似{'Message1': 'A', 'Message2': 'C', 'Message3': 'B'}
的字典
with open('data.csv') as fp:
reader = csv.reader(fp)
d = {'Message1': 'A', 'Message2': 'C', 'Message3': 'B'}
for row in reader:
name, age, *messages = row
for msg in messages:
print(d[msg], end='')
print()
在我看来,您在错误的地方处理错误。由于except
在for
循环之外,将处理错误,但for循环不会继续。尝试将错误处理置于循环中:
import csv
with open('test.dat') as f:
reader = csv.reader(f)
for row in reader:
name = row[0]
age = row[1]
MSG1 = row[2]
try:
MSG2 = row[3]
except IndexError:
# Handling only row[3] and not skipping
# the row
MSG2 = "MISSING DATA"
#for row[2]
if MSG1=='Message1':
print("A", end='')
if MSG1=='Message3':
print("B", end='')
#for row[3]
if MSG2=='Message2':
print("C", end='')
# Add end of line
print("")
更新1:
- 第二个问题是第2行将不会被处理,因为它将引发异常并被跳过
- 在此版本中,异常仅用于处理MSG2。任何其他错误都会使脚本崩溃(如文件末尾的空行或缺少行[2](
打印有点乱,它给出的输出是:
AC
B
但这很容易调整。
您是否尝试过将CSV读取到Pandas DataFrame中,然后从那里进一步处理数据?
import pandas as pd
df = pd.read_csv(f)
for index,element in df:
print(element)
元素将打印CSV中的所有可用列。然后,您可以使用另一个for循环来引用每个元素,并进行进一步的处理/操作