通过不同的变量将其转换为列表时,无法迭代csv.reader对象

时间:2019-07-13 16:42:30

标签: python-3.x csv

当我偶然发现此问题时,我正在执行一些基本的CSV文件操作,现在我知道如何避免它了,但我只是想对正在发生的事情有更好的了解。 每当我想迭代csv.reader对象时,我都可以轻松地做到这一点。但是,每当我尝试通过另一个变量将对象转换为列表时,它都会阻止迭代csv.reader对象的迭代循环。

def checkPlayer(discordName, playerName):
    with open ('PLAYERS.csv', 'r') as fil:
        r = csv.reader(fil)
        l = list(r)
        lineNum = 1 
        for line in r:
            print(line)

l = list(r)阻止了循环的执行。

下面的代码工作正常,并且循环正常执行。

def checkPlayer(discordName, playerName):
    with open ('PLAYERS.csv', 'r') as fil:
        r = csv.reader(fil)
        lineNum = 1 
        for line in r:
            print(line)

我期望发生这种情况的原因是因为将csv.reader转换为列表时,对象发生了迭代,这意味着它将在执行之前在端点处设置csv.reader对象循环。

1 个答案:

答案 0 :(得分:1)

csv.reader表示基础文件(仅在原始文件顶部添加CSV的某些结构)。因此,从头到尾只能读取一次,到达文件末尾不会返回任何内容。

运行l = list(r)时,您将读取由句柄r表示的文件的全部内容,并到达基础文件的末尾。因此,对句柄(for line in r:)的任何进一步迭代将在文件末尾开始,因此您将一无所获。

要解决此问题,您可以将文件倒带到开头:fil.seek(0),然后再次读取文件:

with open ('PLAYERS.csv', 'r') as fil:
        r = csv.reader(fil)
        l = list(r)
        lineNum = 1 
        fil.seek(0)
        for line in r:
            print(line)