Python换行符问题:\r\n还是\n?[通俗易懂]

这是一个很经典的问题。因为不同系统下默认的换行符不同。字符处理时候,这样的“不同”会带来很大的问题,例如line[-2]和line.strip()会因为平台不同返回不同的值。解决方法:Python2(PEP278–UniversalNewlineSupport,感谢毕勤的补充):1)如果不是txt文件,建议用wb和rb来读写。通过二进制读写,不会有换行问题。2)如果需要明文内容,请用…

大家好,又见面了,我是你们的朋友全栈君。

这是一个很经典的问题。因为不同系统下默认的换行符不同。字符处理时候,这样的“不同”会带来很大的问题,例如line[-2]和line.strip()会因为平台不同返回不同的值。

解决方法:

Python 2

PEP 278 — Universal Newline Support,感谢毕勤的补充):

1)如果不是txt文件,建议用wb和rb来读写。通过二进制读写,不会有换行问题。

2)如果需要明文内容,请用rU来读取(强烈推荐),即U通用换行模式(Universal new line mode)。该模式会把所有的换行符(\r \n \r\n)替换为\n。只支持读入,但是也足够了。这是Python 提供给我们的最好的选择,没有之一。

对比r和rU的结果:

content = file(fn, 'r').read()
# test\r\ntest2
# 这里的换行会因不同系统而不同                       
content = file(fn, 'rU').read()
# test\ntest2
# 所有的换行都被统一,不分系统

Python 3

请注意:Python 3不推荐用rU模式!

open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True)

在Python 3,可以通过open函数的newline参数来控制Universal new line mode:读取时候,不指定newline,则默认开启Universal new line mode,所有\n, \r, or \r\n被默认转换为\n ;写入时,不指定newline,则换行符为各系统默认的换行符(\n, \r, or \r\n, ),指定为newline=’\n’,则都替换为\n(相当于Universal new line mode);不论读或者写时,newline=”都表示不转换。

newline controls how universal newlines works (it only applies to text mode). It can be None, ”, ‘\n’, ‘\r’, and ‘\r\n’. It works as follows:

  • On input, if newline is None, universal newlines mode is enabled. Lines in the input can end in ‘\n’, ‘\r’, or ‘\r\n’, and these are translated into ‘\n’ before being returned to the caller. If it is ”, universal newline mode is enabled, but line endings are returned to the caller untranslated. If it has any of the other legal values, input lines are only terminated by the given string, and the line ending is returned to the caller untranslated.
  • On output, if newline is None, any ‘\n’ characters written are translated to the system default line separator,os.linesep. If newline is ”, no translation takes place. If newline is any of the other legal values, any ‘\n’ characters written are translated to the given string.

参考文献:

PEP 278 — Universal Newline Support

Python 3 open: 2. Built-in Functions

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125226.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm中使用anaconda部署python环境_anaconda虚拟环境是什么

    pycharm中使用anaconda部署python环境_anaconda虚拟环境是什么如何在pycharm中使用anaconda的虚拟环境(envs),最近项目中有许多同学咨询,这里就给大家简单介绍一下。

    2022年8月26日
    7
  • bat命令大全_bat暂停命令

    bat命令大全_bat暂停命令文章目录一、bat(批处理文件类型)注意事项命令简介二、使用步骤1.引入库2.读入数据总结一、bat(批处理文件类型)注意事项1.文件保存格式为ANSI2.以管理员身份运行文件命令简介cmd #相当于已管理员身份执行了命令提示符@echo(off|on) #关闭或打开回显命令@echooffipconfigpause #相当于自动打开cmd(命令提示符)输入ipconfig查看电脑网络信息cd/d路径地址 #Windows下进入指定路径pause #一般在

    2022年9月24日
    2
  • Codeblocks的断点调试步骤

    Codeblocks的断点调试步骤首先,新建一个C/C++的codeblocks项目。具体步骤如下:1.新建一个工程(project),注意路径中不要包含中文,否则后面断点调试时会出现问题2.直接选择空工程3.选择C或者C++项目即可4.点开工作空间(workspace)中的Source文件夹,即可对文件进行编辑然后,在.c或者.cpp文件中编写程序,设置断点进行调试。下面以一个…

    2022年5月11日
    99
  • ActiveMQ

    ActiveMQ

    2021年7月8日
    106
  • eclipse如何创建java_eclipse如何创建java项目

    eclipse如何创建java_eclipse如何创建java项目eclipse创建java项目的方法:首先点击箭头所指的file选项,并新建project;然后点击项目下的src包,右键SEC,选择箭头所指的new和CLASS;最后输入框中输入class名称,勾选箭头所指的框。本教程操作环境:windows7系统、java10&&EclipseIDE2020版,DELLG3电脑,该方法适用于所有品牌电脑。相关免费学习推荐:java基础教程…

    2022年7月24日
    8
  • java逻辑删除代码_MybatisPlus实现逻辑删除功能

    java逻辑删除代码_MybatisPlus实现逻辑删除功能逻辑删除你有没有见过某些网站进行一些删除操作之后,你看不到记录了但是管理员却能够查看到。这里就运用到了逻辑删除。什么是逻辑删除?逻辑删除的本质是修改操作,所谓的逻辑删除其实并不是真正的删除,而是在表中将对应的是否删除标识(deleted)或者说是状态字段(status)做修改操作。比如0是未删除,1是删除。在逻辑上数据是被删除的,但数据本身依然存在库中。对应的SQL语句:updateusers…

    2022年6月2日
    115

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号