python - 使用 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
列表,我正在阅读每一行并附加到列表中。
我从这个链接知道它将整个文件读入内存,但是如果你想从数据中创建一个列表,哪种方法更好?
我喜欢第二种方法,虽然它的代码多一点,但很清楚我在做什么,而第一种方法在您进一步检查之前不太清楚。
解决方案
快速浏览一下,看起来我正在用我正在阅读的每一行覆盖一个变量......
这是为什么?你认为with
as awhile
吗?我已经习惯了第一个,对我来说,它看起来就像它的本质:调用readlines()
以读取整个文件。
在我可以快速浏览的地方,我创建了一个员工列表,我正在阅读每一行并附加到
List
.
当我看到一次只处理一个元素或一行的显式for
和while
循环时,我的第一个想法是,“看起来像一个不习惯 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]
推荐阅读
- asp.net-mvc - 我们应该在 .NET CORE 项目中分离 DataModel 和 Controller Model 吗?
- asp.net-core - 使用 Aspnet Core Identiy 实现 CQRS 时如何注册处理程序
- mongodb - 如何使用 Pageable 按地图值排序
- c# - 如何在不更改堆栈跟踪的情况下测试该代码重新引发异常?
- android - 我怎样才能完成“组”活动?
- android - 浮动按钮不采用背景颜色
- cuda - 使用 CUDA 的调色板热图
- javascript - 有没有更好的方法用 map 或 reduce 重构这个 for 循环?
- javascript - 如何修复“未捕获的语法错误:意外的令牌 <”
- javascript - 我可以用另一个小部件覆盖 CKEditor5 小部件,同时保留两者的功能吗?