90%的时候,当我读文件时,结果是这样的:
with open('file.txt') as f:
for line in f:
my_function(line)这似乎是一个非常常见的情况,所以我想了一个更短的方法,但这安全吗?我的意思是,该文件会被正确关闭,或者您是否发现此方法存在其他问题?:
for line in open('file.txt'):
my_function(line)编辑:谢谢埃里克,这似乎是最好的解决方案。希望我不会用它来讨论这个问题,但是当我们想在几个操作中使用行(不仅仅是my_function的参数)时,您对这种方法有什么看法呢?
def line_generator(filename):
with open(filename) as f:
for line in f:
yield line然后使用:
for line in line_generator('groceries.txt'):
print line
grocery_list += [line]这个函数比iterate_over_file有缺点吗?
发布于 2017-02-23 13:45:19
在approach by Eric的基础上,您还可以编写一个函数,使用with对文件进行open,然后只返回文件,从而使其更加通用。然而,这一点:
def with_open(filename):
with open(filename) as f:
return f # won't work!不工作,因为当函数返回时,f文件将由with关闭。相反,您可以使它成为一个生成器函数,并对各个行进行yield:
def with_open(filename):
with open(filename) as f:
for line in f:
yield line或者更短,使用新版本的Python:
def with_open(filename):
with open(filename) as f:
yield from f像这样使用它:
for line in with_open("test.txt"):
print line或者这个:
nums = [int(n) for n in with_open("test.txt")] 发布于 2017-02-23 13:33:06
如果您经常需要这样做,您可以始终定义:
def iterate_over_file(filename, func):
with open(filename) as f:
for line in f:
func(line)
def my_function(line):
print line,你的肾盂内衬现在是:
iterate_over_file('file.txt', my_function)发布于 2017-02-23 13:35:37
使用上下文管理器是最好的方法,这几乎可以为您的一线解决方案铺平道路。如果你天真地想要创建一个一条龙,你可以得到:
with open('file.txt') as f: for line in f: my_function(line) # wrong code!!这是无效的语法。
所以如果你很想要一条单线的话,你可以做
with open('file.txt') as f: [my_function(line) for line in f]但这是一种糟糕的做法,因为您只为副作用创建了一个列表理解(您不关心my_function的返回)。
另一种方法是
with open('file.txt') as f: collections.deque((my_function(line) for line in f), maxlen=0)因此,没有创建列表理解,并且使用迭代工具配方强制使用迭代器(0大小的deque:没有分配内存)
结论
为了达到“丙酮/单线”的目标,我们牺牲了可读性。
有时候,最好的方法并不是一成不变的。
https://stackoverflow.com/questions/42417021
复制相似问题