python-3.x - 通过不同的变量将其转换为列表时无法遍历 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
在执行循环之前将对象设置在端点。
解决方案
表示基础文件(仅在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 - Fortran 编译器错误安装 PyOptSparse
- python - 模块“cv2.cv2”没有属性“xfeatures2d”,模块“cv2.cv2”没有属性“SIFT”
- c# - 使用 Blazor 将输入文本动态绑定到类/对象属性
- node.js - 阻塞代码的node js正常回调场景
- sql-server - 从每个表中的每一列中选择唯一值
- mysql - 如何使用拼写错误的单词搜索 MYSQL 表?
- python - 模型似乎没有学习
- angular - 自 Jest 25 以来,覆盖率报告具有不同的源路径
- java - 按出场次数排序
- tensorflow - Keras-TF 可学习除法/任意运算层