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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IDEA 打不开怎么办 ?「建议收藏」

    IDEA 打不开怎么办 ?「建议收藏」IDEA打不开怎么办?系统win10IDEA2020.1.3使用chooseruntime插件修改运行环境后无法启动IDEA一、修改运行环境导致的(例如:将原本jre8修改为本地的jre11出现了问题)1、搜索idea64.exe.jdk文件。2、找到你本地原来使用的官方jre,本文本地安装的是D:\Java\jdk1.8.0_181\jre。3、将idea64.exe.jdk文件中内容修改为官方可用的。例如:将D:\Java\jdk-11.0.2\bin\

    2022年8月30日
    5
  • springboot下使用拦截器和过滤器[通俗易懂]

    springboot下使用拦截器和过滤器[通俗易懂]1.拦截器InterceptorSpringMVC的拦截器(Interceptor)和Filter不同,但是也可以实现对请求进行预处理,后处理。先介绍它的使用,只需要两步:1.1实现拦截器实现拦截器可以自定义实现HandlerInterceptor接口,也可以通过继承HandlerInterceptorAdapter类,后者是前者的实现类。如果preHandle方法ret…

    2022年7月17日
    18
  • pycharm 2021.11.3激活(注册激活)

    (pycharm 2021.11.3激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    69
  • 操作系统进程有若干个状态,若一个进程_进程和线程的概念

    操作系统进程有若干个状态,若一个进程_进程和线程的概念第二章进程管理-进程、线程进程的概念进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。(线程是调度的基本单位)程序:是静态的,是一个存放在磁盘里的可执行文件,是一系列指令的集合进程:是动态的,是程序的一次执行过程

    2025年8月28日
    5
  • ES 安装 elasticsearch-sql插件「建议收藏」

    ES 安装 elasticsearch-sql插件「建议收藏」1、查看sql插件githubhttps://github.com/NLPchina/elasticsearch-sql2、安装1、cdelasticsearch#进入目录2、./bin/elasticsearch-plugininstallhttps://github.com/NLPchina/elasticsearch-sql/releases/download/5.4.3.0/elasticsearch-sql-5.4.3.0.zip3、下载SQL的Serverwget

    2022年6月21日
    39
  • 广州java培训哪家教育机构比较好_广州java培训课程

    广州java培训哪家教育机构比较好_广州java培训课程如今社会上的就业竞争非常激烈,许多公司都在不断的提高对求职者的需求,大家也逐渐的开始意识到掌握一项适用的技能是非常重要的,一技之长不仅能够给我们带来就业上的巨大优势,还能提高我们的薪资收入,让我们更上一层楼。正因如此,越来越多的同学选择在就业之前通过专业的IT培训机构掌握一项实用的专业技能,而Java成为了进入IT行业的敲门砖,而目前每个城市的Java培训机构都有很多,让人难以选择,经调查,大部分的同学会通过一些排名榜进行参考,而今天,排名榜小编为大家主要介绍广州Java培训机构排名,主要通过教学质量,

    2022年10月3日
    3

发表回复

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

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