繁体   English   中英

误解 end= 参数如何在 print() function 在 while 循环中工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM