继续 运行 Python 代码,但 CSV 单元格的值为空

Continue to run the Python code however the value of CSV cell is null

我有一个 csv 文件作为示例,格式如下,如您所见,可以有一条消息或两条消息,

Sara,27,Message1,Message2
Joe,21,Message3

我的 reader 如下所示,Sara 有 2 条消息,但对于 Joe 有 1 条消息,代码不会是 运行。你介意看看并帮助我吗?

     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

您是否尝试过将 CSV 读入 Pandas DataFrame,然后从那里进一步处理数据?

import pandas as pd

df = pd.read_csv(f)

for index,element in df:
   print(element)

element 将打印 CSV 中的所有可用列。然后,您可以使用另一个 for 循环来引用每个元素并进一步执行 processing/manipulation

在我看来,您在错误的地方处理错误。由于 exceptfor 循环之外,错误将被处理但 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

但这很容易调整。

你可以使用 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()