我今天正在查看一些笔记,并且遇到了以下代码片段:
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获悉,它将整个文件读入内存,但是如果您想从数据中创建列表,哪种方法更好?
我喜欢第二种方法,尽管它需要更多代码,但是很清楚我在做什么,而第一种方法直到您进一步检查时才很清楚。
答案 0 :(得分:3)
快速浏览一下,似乎我正在读取的每一行都覆盖了一个变量...
那是为什么?您是否将with
视为while
?我已经习惯了第一个,对我来说一眼看上去就像是:调用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]