为什么 open() 返回一个空变量?

Why is open() returning an empty variable?

我有一个包含姓名和职位描述列表的文本文件,例如:

Jim Salesman
Dwight Salesman
Pam Receptionist
Michael Manager
Oscar Accountant

我想将“推销员”的姓名和工作添加到列表中。但与此同时,我还想打印出完整的姓名列表和职位描述。我为 Python 编写了以下代码:

employee_file = open("employees.txt", "r")
matching = [sales for sales in employee_file if "Salesman" in sales]
print (matching)

print (employee_file.read())

employee_file.close()

我得到的结果是:

['Jim Salesman\n', 'Dwight Salesman\n']


Process finished with exit code 0

但是,当我散列第 2 行和第 3 行代码时,print(employee_file.read()) 将生成完整的姓名和职位描述列表。

谁能解释为什么在第 2 行和第 3 行代码中 print (employee_file.read()) 是空白的?我怀疑这是因为 employee_file 是一个空变量。但是我不明白为什么会这样。

是否需要定义一个新变量employee_file2并在执行打印功能前重新打开“employees.txt”文件,例如:

employee_file2 = open("employees.txt", "r")
print (employee_file2.read())

在此先感谢您的帮助。

这是因为列表理解

matching = [sales for sales in employee_file if "Salesman" in sales]

将指针设置为文件末尾,因此没有要打印的内容。如果您再次打开文件并打印,它将打印所有内容。

Do I need to define a new variable employee_file2 and reopen the "employees.txt" file before executing the print function

你当然可以,而且它会奏效。您还可以使用 file_name.seek(0) 将指针移回起始位置,以便再次打印整个文件。

Python 使用指针跟踪它在文件中的位置。当您遍历文件的所有行时,就像在您的列表理解中一样,指针会指向文件的末尾。然后,根据 documentation:

If the end of the file has been reached, f.read() will return an empty string ('').

>>> f.read()
'This is the entire file.\n'
>>> f.read()
''

相反,从文件中获取所有数据作为列表,然后对其进行处理,而不是再次触及文件。

with open("employees.txt") as f:
    employees = f.read().splitlines()

salespeople = [e for e in employees if "Salesman" in e]

print(salespeople)
# -> ['Jim Salesman', 'Dwight Salesman']
print(employees)
# -> ['Jim Salesman', 'Dwight Salesman', 'Pam Receptionist', 'Michael Manager', 'Oscar Accountant']

顺便说一句,最好使用 with 语句。然后你不需要手动关闭它,等等。

归功于 jasonharper, jarmod, and TheLazyScripter,他发表的评论激发了这个答案