使用readlines()比创建List更好吗?

时间:2019-02-26 16:26:43

标签: python list file io

我今天正在查看一些笔记,并且遇到了以下代码片段:

def read_entire_file(file):
    with open(file) as f_obj:
        contents = f_obj.readlines()
    print(contents)
    print(type(contents)) # I added this line

快速浏览一下,似乎我正在读取的每一行都覆盖了一个变量,但是,它创建了一个列表,并且您可以验证contents是带有{{1 }} 方法。

将其与以下代码进行比较:

type()

我一眼就能看到,我创建了一个def read_file_into_list(file): employees = [] with open(file) as f_obj: for line in f_obj: employees.append(line.strip()) print(employees) 列表,我在每一行中阅读并追加到列表中。

我从this link获悉,它将整个文件读入内存,但是如果您想从数据中创建列表,哪种方法更好?

我喜欢第二种方法,尽管它需要更多代码,但是很清楚我在做什么,而第一种方法直到您进一步检查时才很清楚。

1 个答案:

答案 0 :(得分:3)

  

快速浏览一下,似乎我正在读取的每一行都覆盖了一个变量...

那是为什么?您是否将with视为while?我已经习惯了第一个,对我来说一眼看上去就像是:调用readlines()以读取整个文件。

  

我一眼就能看到,我创建了一个员工列表,我在每一行中阅读并附加到List

当我看到显式的forwhile循环一次可以处理一个元素或一行时,我的第一个想法是:“看起来像不习惯Python的C ++或Java程序员。”这是你应该摆脱的习惯。在Python中,通常会使用批量操作,列表推导或生成器来避免传统的命令式循环,这是一种更加惯用的方法。

  

我喜欢第二种方法,尽管它需要更多代码,但是很清楚我在做什么,而第一种方法直到您进一步检查时才很清楚。

作为一名经验丰富的Python程序员,我更喜欢第一个。如果要将文件读入内存,请调用readlines()。它按照锡罐上的说明行事。

也就是说,我还要质疑将整个文件读入内存是否正确。也许您应该逐行处理它而不消耗大量内存。在那种情况下,惯用的解决方案确实是for循环。但是,您只需将所有元素都添加到列表中就可以了。

with open(file) as f_obj:
    for line in f_obj:
        process_line(line.strip())

或者,如果剥离空白很重要 ,并且您想将所有内容读入内存,请考虑使用列表理解。

with open(file) as f_obj:
    employees = [line.strip() for line in f_obj]