首页 > 解决方案 > 使用 readlines() 比创建列表更好吗?

问题描述

我今天正在查看一些笔记,我遇到了这段代码:

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使用该方法验证这是一个列表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)

在我可以快速浏览的地方,我创建了一个employee列表,我正在阅读每一行并附加到列表中。

我从这个链接知道它将整个文件读入内存,但是如果你想从数据中创建一个列表,哪种方法更好?

我喜欢第二种方法,虽然它的代码多一点,但很清楚我在做什么,而第一种方法在您进一步检查之前不太清楚。

标签: pythonlistfileio

解决方案


快速浏览一下,看起来我正在用我正在阅读的每一行覆盖一个变量......

这是为什么?你认为withas awhile吗?我已经习惯了第一个,对我来说,它看起来就像它的本质:调用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]

推荐阅读