Generating a list of all the lines in a text file using the with statement
我知道你可以用一行"x for x in y"样式的循环填充列表,可以用它来填充吗?
我试图把文本文件中的所有行都拉到一个列表中,但它似乎不起作用,至少不像我尝试的那样。
我试过:
1
| lines = [ x with open("text.txt").readlines() as x] |
和
1
| lines = [ x.readlines() with open("text.txt") as x] |
它似乎使用了相同的格式,但给了我一个无效的语法错误。我很感激我可以用for来完成它,但我想把使用close()的工作留下来。
这是可能的还是我抓住了稻草?顺便说一下,这是python 2。
- 不知道如何操作,这是关于如何使用的解释,而不是您是否可以操纵WITH语句的形状,您可以操纵FORS和IFS的形状。我欣赏的是一个陈述而不是一个循环,但它可以作为一个,这就是为什么我想知道潜在的形状变化。
- 尽管我现在理解它是一个语句而不是循环。
- 嗯,那个问题的第二个问题是问你用它做什么?
- 我想你看错了,对不起。这完全是关于您是否可以重塑WITH语句。我已经习惯于在用答复重新检查它之前和之后,我可以看到,当我在尝试一行重新格式化之前使用它时,我没有完全理解它,所以这会回答隐含的问题,但仍然不会回答主要的问题,那就是你能用声明重新格式化成一行吗?以类似于for循环的方式。
当这条线路工作时:
1
| with open('file.txt') as fobj: lines = list(fobj) |
使用with和pythonic语法,您需要两行:
1 2
| with open('file.txt') as fobj:
lines = list(fobj) |
这里,fobj是一个迭代器,它允许高效的逐行迭代。用list(fob将其转换成列表与fobj.readlines()具有相同的效果。
- 你知道list(fobj)和fobj.readlines()之间有什么区别吗?直到现在我才用后者。
- 谢谢。我确实纳闷。我一得到允许就接受你的答复。
- 据我所知,这没有区别。
- @Mikem&252;ller太棒了,学到了一些新东西。+ 1
- @Timgeb这就是这个网站的全部内容。我的方法是通过教学来学习。:)
with是一个上下文管理器,不能放在一行中。正如BDFL曾经说过的,"为什么我们需要节省线路?我们不是Perl。"(如中所述,不,我们不需要保存行。)
你可以分为两种:
1 2
| with open("text.txt","r") as x:
lines = x.readlines() |
理解只能使用for语句,不能使用with语句。你只能这样做(没有理由不这样做)
1 2
| with open("text.txt") as x:
lines = x.readlines() |
1
| lines = open("test.txt").readlines() |
这里不需要使用列表理解,而且不管怎样,当您完成后文件不会保持打开状态。
顺便说一句,如果你需要的话,它可以和列表理解结合起来,比如:
1
| lines = [l.strip() for l in open("test.txt").readlines()] |
- 不过,之后仍然需要关闭该文件。
- 实际上,没有。因为没有保存对文件对象的引用,所以它将自动被清除。对于文件对象,这也意味着文件句柄将关闭
- 文件对象超出范围后关闭文件是cpython使用引用计数的一个实现细节,您不应该依赖于这种行为。对于Pypy或Jython等其他Python实现来说,这绝对不是真的。
- 那为什么有with open(file) as fileobject构造呢?依靠垃圾收集器关闭文件句柄是不好的做法。
- 我承认我对Pypy或Jython没有经验,但坦白地说,我不明白为什么至少期望它能起作用会很奇怪。我没有保留对对象的引用,所以我就不用它了。因此,不需要打开文件句柄。称我懒惰,但我已经习惯了用Python来解释的事情。我想如果问题出在我自己的无知上,抱怨是没有意义的,但是我很惊讶,在所有的实现中,它都不是如此直观。不管怎样,我很感谢你的反馈。
- 从python的zen来看:"explicit比implicit好。"—最好是显式关闭依赖于某个后台进程的句柄,这样做(可能)对您有利。with这样做。
- 这是一个很好的观点:)