[英]Misunderstanding how end= argument works in print() function in a while loop
嗨所以我刚开始学习如何读取 Python 中的文件。 因此,我开始使用 Python 使用以下代码编写文件:
with open('dog_breeds.txt', 'w') as writer:
writer.write("Pug\r\nJack Russell Terrier\r\nEnglish Springer Spaniel\r\nGerman Shepherd\r\nStaffordshire Bull Terrier\r\nCavalier King Charles Spaniel\r\nGolden Retriever\r\nWest Highland White Terrier\r\nBoxer\r\nBorder Terrier\r\n")
writer.close()
这会生成一个 .txt 文件,该文件的图像可以在此处看到。
然后,我开始运行以下代码:
import time
reader = open('dog_breeds.txt', 'r+')
line = reader.readline()
print('Output of readline while loop is: ')
while line != '':
print(line, end='')
time.sleep(1)
line = reader.readline()
reader.close()
然后,当我执行代码时,我得到了这个 output:
Output of readline while loop is:
Pug
Jack Russell Terrier
English Springer Spaniel
German Shepherd
Staffordshire Bull Terrier
Cavalier King Charles Spaniel
Golden Retriever
West Highland White Terrier
Boxer
Border Terrier
所以,我有点困惑。 我认为 print() 中的end = ''
参数将导致 .txt 文件中的每一行都打印在上一行打印的末尾,从而导致显示一个长行(即 PugJackRussellTerrierEnglish... )。 相反,显示的是多行,.txt 文件中的每一行都是单独的行。 我有什么误解吗?
这个编写的脚本可以随心所欲地执行:
import time
reader = open('dog_breeds.txt', 'r+')
line = reader.readline()
print('Output of readline while loop is: ')
for i in reader:
line = i.rstrip("\n")
if line:
print(line)
time.sleep(1)
reader.close()
注意.replace("\n", "")
。
运行上述代码的结果如下output:
Output of readline while loop is:
Jack Russell Terrier
English Springer Spaniel
German Shepherd
Staffordshire Bull Terrier
Cavalier King Charles Spaniel
Golden Retriever
West Highland White Terrier
Boxer
Border Terrier
每一行都将在一秒钟后按照您在代码中的预期打印。
默认情况下 python 在打印中使用新行。(打印有end="\n"
作为默认值)
您的文件对每一行都使用\r\n
,因此如果您尝试使用普通打印(没有end=""
)在循环中逐行打印它
它会打印出类似这种格式的东西:
*first_line_in_file
*new empty line because you have \r\n
*new empty line because python print(end="\n")
*second line
...
但现在 end="" 是这样的:
*first_line_in_file
*new empty line because you have \r\n
*second line
...
结论: end=""
不会从您的文本中删除\n
它只是阻止 python 向您的 output 添加额外的\n
。
我不知道您是否使用 Windows,但是当我运行您的代码时:
with open('dog_breeds.txt', 'w') as writer:
writer.write("Pug\r\nJack Russell Terrier\r\nEnglish Springer Spaniel\r\nGerman Shepherd\r\nStaffordshire Bull Terrier\r\nCavalier King Charles Spaniel\r\nGolden Retriever\r\nWest Highland White Terrier\r\nBoxer\r\nBorder Terrier\r\n")
在我的 Windows 机器上,换行符\r\n
创建了两个换行符:
Pug
Jack Russell Terrier
English Springer Spaniel
German Shepherd
Staffordshire Bull Terrier
Cavalier King Charles Spaniel
Golden Retriever
West Highland White Terrier
Boxer
Border Terrier
因此,当您开始读取文件时,即使您使用end=''
参数进行打印,仍然会有一个额外的新行。
为了克服这个问题,您需要在剥离时检查该行是否有数据,然后打印它,如果该行有数据,例如:
with open('dog_breeds.txt') as reader:
for line in reader:
if line.rstrip(): # if the stripped line has data
print(line.rstrip(), end='')
结果:
PugJack Russell TerrierEnglish Springer SpanielGerman ShepherdStaffordshire Bull TerrierCavalier King Charles SpanielGolden RetrieverWest Highland White TerrierBoxerBorder Terrier
以下内容适用于 Unix 和 Windows 系统:
import re
FILE = 'dog_breeds.txt'
with open(FILE, 'w') as writer:
writer.write("Pug\r\nJack Russell Terrier\r\nEnglish Springer Spaniel\r\nGerman Shepherd\r\nStaffordshire Bull Terrier\r\nCavalier King Charles Spaniel\r\nGolden Retriever\r\nWest Highland White Terrier\r\nBoxer\r\nBorder Terrier\r\n")
with open(FILE) as reader:
print(re.sub('[\r\n]', '', reader.read()))
Output:
PugJack Russell TerrierEnglish Springer SpanielGerman ShepherdStaffordshire Bull TerrierCavalier King Charles SpanielGolden RetrieverWest Highland White TerrierBoxerBorder Terrier
https://docs.python.org/3/library/functions.html#print
“sep 和 end 都必须是字符串;它们也可以是 None,这意味着使用默认值。如果没有给出对象,print() 将只写 end。”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.