为什么 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,他发表的评论激发了这个答案
我有一个包含姓名和职位描述列表的文本文件,例如:
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,他发表的评论激发了这个答案