python-3.x - 通过不同变量将 csv.reader 对象转换为列表时无法迭代该对象

标签 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执行循环之前端点处的对象。

最佳答案

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/

相关文章:

python - 如何返回 API 响应并同时使程序失败?

Python:如何将区域保持在 canny close edge 的区域内

Python 2 与 Python 3 正则表达式匹配行为

c# - 定界字符串解析?

Python 带条件断言

python-3.x - 如何设置索引变量的值? - 皮莫

python - 在Python中将多行字符串转换为字典

python - 使用 Python 将 CSV 转换为带有子列表数组的 JSON

java - 使用 apache commons csv 读取 csv 文件时跳过双引号

javascript - 如何在 D3.js 中创建 CSV 条目的唯一列表?