Python 在打印文件内容后是否仍打印尾随换行符?

问题描述 投票:0回答:1

免责声明:我知道我基本上回答了我自己的问题,但无论如何请幽默我。

我正在阅读一本 Python 书(Python 速成课程第二版),它说:“此文件与原始文件之间的输出之间的唯一区别是输出末尾的额外空行. 出现空行是因为 read() 在到达文件末尾时返回一个空字符串;这个空字符串显示为空行。如果要删除多余的空行,可以在调用中使用 rstrip()打印()。”这就是他们在书中使用的确切措辞。然而,当我按照他们告诉我的去做时,不会打印任何空行。

我的代码:

with open('/workspaces/functions/files_exceptions/pi_digits.txt', encoding='utf-8') as file_object:
    contents = file_object.read()

print(contents)
print("Hello World!") # To show a newline is not printed

我正在阅读的文件:

 3.1415926535
      8979323846
      2643383279

输出:

3.1415926535
  8979323846
  2643383279
Hello World!

如您所见,Python 没有打印尾随换行符。它不再这样做了吗?我知道 Python 现在是 3.12 版本,所以我想知道这是否是最近对 Python 所做的更改。但可能不是,因为我正在使用的 VS Code 存储库是在更新之前创建的(我不知道它是否自动更新,或者是否必须手动更新(如果是,如何更新)(请告诉我这个问题的答案))。

python file file-read trailing-newline
1个回答
0
投票

我不认为你引用的书是正确的。

f.read()
在返回的字符串末尾是否有换行符取决于正在读取的文件的内容。许多文本编辑器会在文本文件末尾添加换行符,即使用户没有手动输入它们。我也使用 Visual Studio Code,我的经验是它不会在文件末尾强制换行,因此我认为编辑器或编辑器设置的差异最有可能解释您的行为差异。

观察以下测试,其中我使用

echo -n
创建一个末尾没有换行符的文件,并使用
echo
创建一个末尾有换行符的文件:

WSL /tmp/python-test$ echo -n "Test with no newline at the end" > no-newline.txt
WSL /tmp/python-test$ echo "Test with newline at the end" > newline.txt
WSL /tmp/python-test$ cat test.py
with open('no-newline.txt') as f:
  textWithoutNewline = f.read()
with open('newline.txt') as f:
  textWithNewline = f.read()

print('=' * 10)
print(textWithoutNewline)
print('=' * 10)
print(textWithNewline)
print('=' * 10)
WSL /tmp/python-test$ python3 test.py
==========
Test with no newline at the end
==========
Test with newline at the end

==========
WSL /tmp/python-test$
© www.soinside.com 2019 - 2024. All rights reserved.