首页 > 解决方案 > 通过不同的变量将其转换为列表时无法遍历 csv.reader 对象

问题描述

当我偶然发现这个问题时,我正在做一些基本的 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在执行循环之前将对象设置在端点。

标签: python-3.xcsv

解决方案


表示基础文件(仅在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)

推荐阅读