当我偶然发现这个问题时,我正在做一些基本的 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
执行循环之前端点处的对象。
最佳答案
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)
关于python-3.x - 通过不同变量将 csv.reader 对象转换为列表时无法迭代该对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57021049/