当我偶然发现此问题时,我正在执行一些基本的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
对象循环。
答案 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)