首页 > 解决方案 > 我在 python 中的列表由于某种原因被 [' '] 覆盖

问题描述

我有一个 python 程序,它从 csv 文件中读取生日列表并确定其中是否有今天。代码应该读取每一行,拆分输入,并将每个组件分配给适当的变量。这是代码:

# checks birthday list for any birthdays
        for entry in birthday_list:
            string = birthday_list.readline()
            string = string[:-1]
            info = string.split(',')
            print(info)
            name = info[0]
            birth_day = int(info[1])
            birth_month = int(info[2])
            birth_year = int(info[3])
            # sends message
            if (day == birth_day and month == birth_month):
                age = year - birth_year
                wish_string = 'Happy ' + str(age) + determine_ordinal(age) + ' birthday, ' + name + '!\nhttps://imgur.com/a/G3wEPyg'
                await channel.send(wish_string)
        birthday_list.close()

真正的输出有个人信息,但这就是它的样子:

['Ponkachu', '7', '8', '2020']
['']

我在将birth_day 分配给 int(info[1]) 的行出现 IndexError

print(string) 打印“Ponkachu,7,8,2020”

如果我将 print(info) 更改为 print(info[1]),它会给我“7”,然后是 IndexError

如果我将其更改为 print(len(info)),我会得到:

4

1

我完全不知道为什么会这样。信息怎么了?为什么突然变了?

编辑:我刚刚检查了 csv 文件。“Ponkachu,7,8,2020”实际上是第二行,所以出于某种原因跳过了第一行。

编辑 2:原来 entry 被设置为第一行的输入。此代码按预期工作:

for entry in birthday_list:
            info = entry.split(',')
            info[3] = info[3][:-1]
            name = info[0]
            birth_day = int(info[1])
            birth_month = int(info[2])
            birth_year = int(info[3])
            # sends message
            if (day == birth_day and month == birth_month):
                age = year - birth_year
                wish_string = 'Happy ' + str(age) + determine_ordinal(age) + ' birthday, ' + name + '!\nhttps://imgur.com/a/G3wEPyg'
                await channel.send(wish_string)
        birthday_list.close()

标签: pythonlistcsvindex-error

解决方案


迭代已经从文件中读取了一行;调用readline获取下一行(忽略混合迭代的危险以及readline由于迭代器的内部缓冲)。

    for entry in birthday_list:
        info = entry.rstrip('\n').split(',')
        print(info)
        name = info[0]
        birth_day = int(info[1])
        birth_month = int(info[2])
        birth_year = int(info[3])
        # sends message
        if day == birth_day and month == birth_month:
            age = year - birth_year
            wish_string = f'Happy {age}{determine_ordinal(age)} birthday, {name}!\nhttps://imgur.com/a/G3wEPyg'
            await channel.send(wish_string)
    birthday_list.close()

推荐阅读