Python 3.x Can';当通过不同的变量将csv.reader对象转换为列表时,不要迭代该对象

Python 3.x Can';当通过不同的变量将csv.reader对象转换为列表时,不要迭代该对象,python-3.x,csv,Python 3.x,Csv,当我偶然发现这个问题时,我正在做一些基本的CSV文件操作,现在我知道如何避免它,但我只是想更好地了解发生了什么。 每当我想迭代csv.reader对象时,我都可以很容易地完成。但是,每当我试图通过另一个变量将对象转换为列表时,它就会阻止迭代csv.reader对象的迭代循环启动 def checkPlayer(discorname,playerName): 以open('PLAYERS.csv','r')作为fil: r=csv.读卡器(fil) l=列表(r) lineNum=1 对于r中的行

当我偶然发现这个问题时,我正在做一些基本的CSV文件操作,现在我知道如何避免它,但我只是想更好地了解发生了什么。 每当我想迭代
csv.reader
对象时,我都可以很容易地完成。但是,每当我试图通过另一个变量将对象转换为列表时,它就会阻止迭代
csv.reader
对象的迭代循环启动

def checkPlayer(discorname,playerName):
以open('PLAYERS.csv','r')作为fil:
r=csv.读卡器(fil)
l=列表(r)
lineNum=1
对于r中的行:
打印(行)
l=list(r)
是阻止循环执行的因素

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

def checkPlayer(discorname,playerName):
以open('PLAYERS.csv','r')作为fil:
r=csv.读卡器(fil)
lineNum=1
对于r中的行:
打印(行)

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

csv.reader表示底层文件(仅在原始文件的顶部添加一些CSV结构)。因此,它可以从开始到结束读取一次,并且在到达文件末尾后不会返回任何内容

当您运行
l=list(r)
时,您将读取由句柄
r
表示的文件的全部内容,并到达基础文件的结尾。因此,在句柄上的任何进一步迭代(
对于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)

这也许能回答你的问题question@RamPrabodhInduri-这并没有解决S.Riyadh的问题。谢谢!我现在对代码片段中发生的事情有了更好的理解