带有枚举的基本 python 文件-io 变量
Posted
技术标签:
【中文标题】带有枚举的基本 python 文件-io 变量【英文标题】:Basic python file-io variables with enumerate 【发布时间】:2011-09-22 07:55:51 【问题描述】:python 新手,尝试学习文件 i/o 的原理。
我正在以这种格式从一个大(200 万行)文件中提取行:
56fr4
4543d
4343d
5irh3
这是我用来返回代码的函数:
def getCode(i):
with open("test.txt") as f:
for index, line in enumerate(f):
if index == i:
code = # what does it equal?
break
return code
一旦索引到达正确的位置 (i),我使用什么语法来设置代码变量?
【问题讨论】:
这个问题之前(***.com/questions/2081836/…)已经被问过(几次)并且有一些很好的答案,有讨论;一些使用 enumerate 和一些 linecache(可能更快)。也有一些不好的答案,这本身就很有教育意义。 【参考方案1】:code = line.strip()
将代码分配给等于 i 的行号,同时删除尾随的新行。
你还需要稍微更新一下你的代码
def getCode(i):
with open('temp.txt', 'r') as f:
for index, line in enumerate(f):
if index == i:
code = line.strip()
return code
为什么需要.strip()
>>> def getCode(i):
... with open('temp.txt') as f:
... for index, line in enumerate(f):
... if index == i:
... code = line
... return code
...
>>> getCode(2)
" 'LINGUISTIC AFFILIATION',\n"
是的,“'语言从属关系'”在我当前的 temp.txt'中
【讨论】:
strip() 是不必要的,因为只有 readlines() 添加尾随换行符。 就是这种情况。请参阅解决此问题的更新答案。 “返回码”应该在休息之前?我认为 return 总是应该是函数的最后一行..? 好吧,如果你在返回代码之前中断,代码将不会被返回,如果你在if
之外返回代码,你就会冒着代码永远不会被定义的风险。试试吧。我只是在回答之前做了。您可以定义 else
或 try
以在最后返回代码,但这是完全正确的。
您可以在函数内的任何位置return
。 (您是否应该是一个更大的论点;尝试做您可以轻松理解的事情。)这里的break
是不必要的,并且永远无法联系到。一旦遇到“返回”,该函数的调用就会停止做更多的工作并返回任何值。【参考方案2】:
enumerate
将一个迭代器转换为另一个迭代器,这样您迭代的事物就成为一对(数字 ID,来自底层迭代器的原始项目)。
在我们的例子中:
for index, line in enumerate(f):
f
是文件对象。文件对象是迭代器:它们迭代文件的行。
我们将其转换为(行号,文件中的行)对的迭代器。
for
循环语法遍历迭代器,并将(行号,文件中的行)对分配给变量:(索引,行)。这只是将一个元组分配给另一个元组的正常行为。
因此,每次循环时,index
都会被分配一个行号,line
会从文件中获得相应的行号。文件中的行是您想要的(可能带有一些格式),line
包含它,所以...
如果以上任何内容没有意义,您可能需要重新阅读该语言的介绍。
【讨论】:
+1 感谢您花时间解释enumerate
而不仅仅是像我那样给他“他需要的东西”。或像其他人一样复制指向文档的链接。我之前看到有人用简单的“sudo”回答了一个问题,并将其链接到*** =(
我经常用那种简洁的方式回答问题,但有时似乎显然有必要通过事情与人们交谈。
我正在尝试在学习的过程中编写基本脚本。如果我只是“阅读介绍”,它不会粘住任何东西,所以我试着读一点,然后做一个小项目,等等。在黑板上的某个地方,我可以问我更简单的问题,而不会让人生气吗?我多次阅读 enumerate 文档,但它的措辞对我来说没有意义。以上是关于带有枚举的基本 python 文件-io 变量的主要内容,如果未能解决你的问题,请参考以下文章
使用 scipy.io.loadmat 从 .mat Matlab 文件中将字典键转换为 Python 中具有相同值的变量名