首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有节能型单线管在文件行上进行迭代?

是否有节能型单线管在文件行上进行迭代?
EN

Stack Overflow用户
提问于 2017-02-23 13:23:41
回答 3查看 112关注 0票数 4

90%的时候,当我读文件时,结果是这样的:

代码语言:javascript
复制
with open('file.txt') as f:
    for line in f:
        my_function(line)

这似乎是一个非常常见的情况,所以我想了一个更短的方法,但这安全吗?我的意思是,该文件会被正确关闭,或者您是否发现此方法存在其他问题?:

代码语言:javascript
复制
for line in open('file.txt'):
    my_function(line)

编辑:谢谢埃里克,这似乎是最好的解决方案。希望我不会用它来讨论这个问题,但是当我们想在几个操作中使用行(不仅仅是my_function的参数)时,您对这种方法有什么看法呢?

代码语言:javascript
复制
def line_generator(filename):
    with open(filename) as f:
        for line in f:
            yield line

然后使用:

代码语言:javascript
复制
for line in line_generator('groceries.txt'):
    print line
    grocery_list += [line]

这个函数比iterate_over_file有缺点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-23 13:45:19

approach by Eric的基础上,您还可以编写一个函数,使用with对文件进行open,然后只返回文件,从而使其更加通用。然而,这一点:

代码语言:javascript
复制
def with_open(filename):
    with open(filename) as f:
        return f  # won't work!

不工作,因为当函数返回时,f文件将由with关闭。相反,您可以使它成为一个生成器函数,并对各个行进行yield

代码语言:javascript
复制
def with_open(filename):
    with open(filename) as f:
        for line in f:
            yield line

或者更短,使用新版本的Python:

代码语言:javascript
复制
def with_open(filename):
    with open(filename) as f:
        yield from f

像这样使用它:

代码语言:javascript
复制
for line in with_open("test.txt"):
    print line

或者这个:

代码语言:javascript
复制
nums = [int(n) for n in with_open("test.txt")]    
票数 1
EN

Stack Overflow用户

发布于 2017-02-23 13:33:06

如果您经常需要这样做,您可以始终定义:

代码语言:javascript
复制
def iterate_over_file(filename, func):
    with open(filename) as f:
        for line in f:
            func(line)


def my_function(line):
    print line,

你的肾盂内衬现在是:

代码语言:javascript
复制
iterate_over_file('file.txt', my_function)
票数 5
EN

Stack Overflow用户

发布于 2017-02-23 13:35:37

使用上下文管理器是最好的方法,这几乎可以为您的一线解决方案铺平道路。如果你天真地想要创建一个一条龙,你可以得到:

代码语言:javascript
复制
with open('file.txt') as f:  for line in f:   my_function(line)   # wrong code!!

这是无效的语法。

所以如果你很想要一条单线的话,你可以做

代码语言:javascript
复制
with open('file.txt') as f:  [my_function(line) for line in f]

但这是一种糟糕的做法,因为您只为副作用创建了一个列表理解(您不关心my_function的返回)。

另一种方法是

代码语言:javascript
复制
with open('file.txt') as f:  collections.deque((my_function(line) for line in f), maxlen=0)

因此,没有创建列表理解,并且使用迭代工具配方强制使用迭代器(0大小的deque:没有分配内存)

结论

为了达到“丙酮/单线”的目标,我们牺牲了可读性。

有时候,最好的方法并不是一成不变的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42417021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档