如何解决继续运行Python代码,但是CSV单元格的值为空
我有一个以下格式的csv文件作为示例,如您所见,可能有一个或两个消息,
Sara,27,Message1,Message2
Joe,21,Message3
我按如下方式编写我的阅读器,它对Sara发出2条消息可以正常工作,但对于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','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)
element将打印CSV中所有可用的列。然后,您可以使用另一个for循环来引用每个元素并进行进一步的处理/操作
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。