误解了while循环中print()函数中end=参数的工作方式


大家好,我刚刚开始学习如何在Python中读取文件。因此,我开始使用Python编写一个文件,代码为:
with open('dog_breeds.txt', 'w') as writer:
writer.write("PugrnJack Russell TerrierrnEnglish Springer SpanielrnGerman ShepherdrnStaffordshire Bull TerrierrnCavalier King Charles SpanielrnGolden RetrieverrnWest Highland White TerrierrnBoxerrnBorder Terrierrn")
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 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文件中每一行是一个单独的行。是不是我误会了什么?

默认情况下,python在打印中使用新行。(打印默认值为end="n"(

您的文件每行使用rn,因此如果您尝试使用普通打印(不使用end=""(在循环中逐行打印

它会打印这样的格式:

*first_line_in_file
*new empty line because you have rn
*new empty line because python print(end="n")
*second line
...

但是现在用end="0"它是这样的:

*first_line_in_file
*new empty line because you have rn
*second line
...

结论end=""不会从文本中删除n,它只是阻止python向输出中添加额外的n

我不知道你是否在使用Windows,但当我运行你的代码时:

with open('dog_breeds.txt', 'w') as writer:
writer.write("PugrnJack Russell TerrierrnEnglish Springer SpanielrnGerman ShepherdrnStaffordshire Bull TerrierrnCavalier King Charles SpanielrnGolden RetrieverrnWest Highland White TerrierrnBoxerrnBorder Terrierrn")

在我的Windows机器上,换行符rn创建两个换行符:

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("PugrnJack Russell TerrierrnEnglish Springer SpanielrnGerman ShepherdrnStaffordshire Bull TerrierrnCavalier King Charles SpanielrnGolden RetrieverrnWest Highland White TerrierrnBoxerrnBorder Terrierrn")
with open(FILE) as reader:
print(re.sub('[rn]', '', reader.read()))

输出:

PugJack Russell TerrierEnglish Springer SpanielGerman ShepherdStaffordshire Bull TerrierCavalier King Charles SpanielGolden RetrieverWest Highland White TerrierBoxerBorder Terrier

这个编写的脚本可以随心所欲地执行:

import time
reader = open('dog_breeds.txt', 'r+')
print('Output of readline while loop is: ')
for i in reader:
line = i.rstrip("n")
if line:
print(line)
time.sleep(1)
reader.close()

注意CCD_ 10。

运行上述代码的结果是以下输出:

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

每一行都会在一秒钟后按照您在代码中的意图打印出来。

https://docs.python.org/3/library/functions.html#print

"sep和end都必须是字符串;它们也可以是None,这意味着使用默认值。若并没有给出对象,print((将只写结束">

最新更新