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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 中国移动apn接入点选哪个网速快(中国移动数据接入点怎么设置)

    中国移动有cmwap,cmnet和LTE三种网络接入点。这三个网络接入点的特点各有不同。其中LTE就是指4G,网络速度相较其他两种接入点速度更快,流量损耗速度也更快。具体介绍如下:1、CMNET可以获得完全的Internet访问权。我们通过CMWAP只能访问WAP网站。CMWAP使用HTTP代理协议和WAP网关协议可以访问到Internet。CMNET则适用于所有协议,它也是标准的TCP/IP协议…

  • docker端口映射无法访问的解决

    docker端口映射无法访问的解决表现systemctlstatusdocker,显示正常,可以pull,push,build宿主机访问外网没问题,可以连上ubuntu的阿里的源运行容器映射的端口在本机无法访问,用curl127.0.0.1:端口,显示:curl:(56)Recvfailure:Connectionresetbypeerdockerbuild的时候,使用apt-getinstallxx,无法访问,哪怕镜像源是国内的阿里之类的.在改为dockerbuild–networkho

    2022年10月17日
  • pycharm配置python运行环境_pycharm安装django

    pycharm配置python运行环境_pycharm安装django新手下载安装pycharm并且配置pycharm下载安装pycharm电脑是32位就选择32位电脑是64位就选择64位选择next就搞定了配置环境变量第一步、找到pycharm的程序文件的地址右键->属性->复制“起始位置”里面的位置第二步、添加到电脑的环境变量我的电脑->右键->属性->高级系统设置->高级->环境变量->Administrator->找到Path->编辑->新建->粘贴pycharm程序文件地址-&

  • hexdump用法_comm命令

    hexdump用法_comm命令hexdump命令是Linux下的打印16进制的利器,它可以按我们指定的格式输出16进制,特别有用,配合eeprom来用简直是绝配。今天我们来介绍一个hexdump命令的使用: 首先我们准备一个测试用的文件test,十六进制如下: [plain]viewplaincopy00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  …

  • springboot mybatis 项目框架源码 shiro 集成代码生成器 ehcache缓存

    springboot mybatis 项目框架源码 shiro 集成代码生成器 ehcache缓存

  • micropython教程_md转word

    micropython教程_md转word之前的博客格式不太完美,所以我学习了一下MD编译器相关操作,并把常用的操作总结在这篇博客里面,希望大家可以学习一下,来美观自己的博客

发表回复

您的电子邮箱地址不会被公开。

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