返回顶部
首页 > 资讯 > 后端开发 > Python >python open函数中newline参数实例详解
  • 168
分享到

python open函数中newline参数实例详解

2024-04-02 19:04:59 168人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录问题的由来具体实例总结问题的由来 我在读pythoncsv模块文档 看到了这样一句话 如果 csvfile 是文件对象,则打开它时应使用 newline=‘&rsqu

问题的由来

我在读pythoncsv模块文档 看到了这样一句话

如果 csvfile 是文件对象,则打开它时应使用 newline=‘’。
其备注:如果没有指定 newline=‘’,则嵌入引号中的换行符将无法正确解析,并且在写入时,使用 \r\n 换行的平台会有多余的 \r 写入。由于 csv 模块会执行自己的(通用)换行符处理,因此指定 newline=‘’ 应该总是安全的。

我就在思考open函数中的newline参数的作用,因为自己之前在使用open函数时从来没有设置过newline参数,仅从上面官方给的备注理解newline参数可以帮助处理换行符解析的问题

并且查阅得知不同操作系统换行符并不一致:

Unix 的行结束约定 ‘\n’、windows 的约定 ‘\r\n’ 以及旧版 Macintosh 的约定 ‘\r’

打破了我原本观念以为的换行符就是\n

Python官方文档对newline参数解释:

newline 控制 universal newlines 模式如何生效(它仅适用于文本模式)。它可以是 None,‘’,‘\n’,‘\r’ 和 ‘\r\n’。它的工作原理:
从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以 ‘\n’,‘\r’ 或 ‘\r\n’ 结尾,这些行被翻译成 ‘\n’ 在返回呼叫者之前。如果它是 ‘’,则启用通用换行模式,但行结尾将返回给调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者。
将输出写入流时,如果 newline 为 None,则写入的任何 ‘\n’ 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 ‘’ 或 ‘\n’,则不进行翻译。如果 newline 是任何其他合法值,则写入的任何 ‘\n’ 字符将被转换为给定的字符串。

从这也就理解了为什么原本使用open()写的时候用\n就可以表示换行以及读文本文件时行尾会返回\n

  • 写入的时候没有指定newline参数会将\n翻译成系统默认的行分割符(\r\n)
  • 读的时候没有指定newline参数会将行分割符(\r\n)翻译为\n

回到上文,那为什么在读写csv文件时就要设置newline=''呢?

pythoncsv官方文档解释了这一问题(这也就引入了第二种方法解决换行的问题,我在后面会介绍到)

Dialect.lineterminator
放在 writer 产生的行的结尾,默认为 ‘\r\n’。
注解 reader 经过硬编码,会识别 ‘\r’ 或 ‘\n’ 作为行尾,并忽略 lineterminator。未来可能会更改这一行为。

用白话说就是writerow()方法在写入一行数据时在行尾都会跟一个默认换行符(\r\n)(即csv是将’一行数据\r\n’写入内存,此时这一行数据还在内存中,还没有写入文件)之后执行代码真正在向文件写入时根据不同newline参数进行翻译
而在向txt文件使用write()方法写入内容时是我们手动添加换行符\n(内存中的数据就是我们写入的内容,并不会隐式添加其他内容)之后执行代码真正在向文件写入时根据newline参数进行翻译,这就是二者的区别
具体流程:
newline=‘’
writer.writerow(‘line’) 实际是向内存中写入’line\r\n’ --》 执行代码,写入文件,根据newline=‘’,将不进行翻译 --》文件最终写入’line\r\n’
newline=None(默认)
f.write(‘line\n’) 直接将’line\n’写入内存 --》 执行代码,写入文件,根据newline=None,将\n翻译为\r\n --》文件最终写入’line\r\n’

具体实例

case1: w newline=‘’ r newline=‘’

import csv
with open("test.csv","w",encoding='utf-8',newline='') as csvfile:
	    writer=csv.writer(csvfile)
	    writer.writerow(["num","name","grade"])
	    writer.writerows([[1,'luke','96'],[2,'jack','85'],[3,'nick','84']])
with open("test.csv","r",encoding='utf-8',newline='') as csvfile:
	    txtdata=csvfile.read()
txtdata      #>>'num,name,grade\r\n1,luke,96\r\n2,jack,85\r\n3,nick,84\r\n'

case2: w newline=‘\r’ r newline=‘’

import csv
with open("test.csv","w",encoding='utf-8',newline='\r') as csvfile:
	    writer=csv.writer(csvfile)
	    writer.writerow(["num","name","grade"])
	    writer.writerows([[1,'luke','96'],[2,'jack','85'],[3,'nick','84']])
with open("test.csv","r",encoding='utf-8',newline='') as csvfile:
	    txtdata=csvfile.read()
txtdata  #>>'num,name,grade\r\r1,luke,96\r\r2,jack,85\r\r3,nick,84\r\r'

case3: w newline=‘\r\n’ r newline=‘’

import csv
with open("test.csv","w",encoding='utf-8',newline='\r\n') as csvfile:
	    writer=csv.writer(csvfile)
	    writer.writerow(["num","name","grade"])
	    writer.writerows([[1,'luke','96'],[2,'jack','85'],[3,'nick','84']])
with open("test.csv","r",encoding='utf-8',newline='') as csvfile:
	    txtdata=csvfile.read()
txtdata  #>>'num,name,grade\r\r\n1,luke,96\r\r\n2,jack,85\r\r\n3,nick,84\r\r\n'

case4: w newline=None r newline=None

import csv
with open("test.csv","w",encoding='utf-8',newline=None) as csvfile:
	    writer=csv.writer(csvfile)
	    writer.writerow(["num","name","grade"])
	    writer.writerows([[1,'luke','96'],[2,'jack','85'],[3,'nick','84']])
with open("test.csv","r",encoding='utf-8',newline=None) as csvfile:
	    txtdata=csvfile.read()
txtdata  #>>'num,name,grade\n\n1,luke,96\n\n2,jack,85\n\n3,nick,84\n\n'

case5: 文件写入为\r\r\n 文件读取 newline=‘\r’

with open("test.csv","r",encoding='utf-8',newline='') as csvfile:
	txtdata=csvfile.read()
txtdata  #>>'num,name,grade\r\r\n1,luke,96\r\r\n2,jack,85\r\r\n3,nick,84\r\r\n'
import csv
with open("test.csv","r",encoding='utf-8',newline='\r') as csvfile:
    content = csv.reader(csvfile)
    for i in content:
        print(i)

为什么会报错:

csv.reader是如何读取\r\r\n的:读取时遇到\r认为一行结束了,再一次遇到\r同样认为一行结束(因而返回了空串列表),遇到\n无法解释–》报错

case6:文件写入为\r\r\n 文件读取 newline=‘\n’

with open("test.csv","r",encoding='utf-8',newline='') as csvfile:
    txtdata=csvfile.read()
txtdata  #>>'num,name,grade\r\r\n1,luke,96\r\r\n2,jack,85\r\r\n3,nick,84\r\r\n'
import csv
with open("test.csv","r",encoding='utf-8',newline='\n') as csvfile:
    content = csv.reader(csvfile)
    for i in content:
        print(i)

case7:文件写入为\r\r\n 文件读取newline=‘\r\n’

with open("test.csv","r",encoding='utf-8',newline='') as csvfile:
    txtdata=csvfile.read()
txtdata  #>>'num,name,grade\r\r\n1,luke,96\r\r\n2,jack,85\r\r\n3,nick,84\r\r\n'
import csv
with open("test.csv","r",encoding='utf-8',newline='\r\n') as csvfile:
    content = csv.reader(csvfile)
    for i in content:
        print(i)

case8:文件写入为\r\r 文件读取 newline=‘\r’

with open("test.csv","r",encoding='utf-8',newline='') as csvfile:
    txtdata=csvfile.read()
txtdata  #>>'num,name,grade\r\r1,luke,96\r\r2,jack,85\r\r3,nick,84\r\r'
import csv
with open("test.csv","r",encoding='utf-8',newline='\r') as csvfile:
    content = csv.reader(csvfile)
    for i in content:
        print(i)

第二种方法:通过设置csv.writer方法中的lineterminator参数

上面提到lineterminator参数控制writer写入每一行后跟的隐式结束符,默认为’\r\n’,因此我们需要要设置lineterminator=‘\n’,读取时也不需要设置newline参数即可获得想要的效果

import csv
with open("test.csv","w",encoding='utf-8') as csvfile:
    writer=csv.writer(csvfile,lineterminator='\n')
    writer.writerow(["num","name","grade"])
    writer.writerows([[1,'luke','96'],[2,'jack','85'],[3,'nick','84']])
with open("test.csv","r",encoding='utf-8') as csvfile:
    lst=csv.reader(csvfile)
    csvfile.seek(0)
    txtdata = csvfile.read()
    csvfile.seek(0)
    for i in lst:
        print(i)
txtdata #>>'num,name,grade\n1,luke,96\n2,jack,85\n3,nick,84\n'

总结

到此这篇关于python open函数中newline参数实例详解的文章就介绍到这了,更多相关python open函数newline参数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python open函数中newline参数实例详解

本文链接: https://lsjlt.com/news/118831.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python open函数中newline参数实例详解
    目录问题的由来具体实例总结问题的由来 我在读pythoncsv模块文档 看到了这样一句话 如果 csvfile 是文件对象,则打开它时应使用 newline=‘&rsqu...
    99+
    2024-04-02
  • Python Open函数详解
    这里写目录标题 一级目录二级目录三级目录1、文件IO的常见操作2、打开操作Open2.1 file 文件名2.2 mode 模式2.2.1. R模式:mode = "r"2.2.2. W模式:...
    99+
    2023-10-24
    python 开发语言 linux
  • python中函数open有哪些参数
    python中open函数的参数有以下几种open:open()函数的作用是用于打开一个文件。open()函数语法:open(name[, mode[, buffering]])参数:name:必需,需打开文件的路径。mode:必需,文件打...
    99+
    2024-04-02
  • linux 中open()函数详解及简单实例
    open()函数创建文件时便捷的权限设置 头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcnt...
    99+
    2022-06-04
    详解 函数 实例
  • Python 含参构造函数实例详解
    本篇博文主要介绍在Python3中如何构造含参构造函数 样例如下: class MyOdlHttp: username = '' password = '' def __init__(se...
    99+
    2022-06-04
    详解 函数 实例
  • python中函数的参数详解
    目录一、参数的定义1、函数的参数在哪里定义2、带参数的函数调用:二、参数分类1、根据实参进行分类1.1、位置参数(未命名参数)1.2、关键字参数(命名参数)2、根据形参进行分类2.1...
    99+
    2024-04-02
  • python中函数传参详解
    一、参数传入规则 可变参数允许传入0个或任意个参数,在函数调用时自动组装成一个tuple; 关键字参数允许传入0个或任意个参数,在函数调用时自动组装成一个dict; 1. 传入可变参数: def ca...
    99+
    2022-06-04
    详解 函数 python
  • React.memo函数中的参数示例详解
    目录React.memo?这是个啥?React.memo的第一个参数父组件子组件React.memo优化React.memo的第二个参数父组件子组件React.memo优化父组件子组...
    99+
    2024-04-02
  • python中np.random.permutation函数实例详解
    目录一:函数介绍二:实例2.1 直接处理数组或列表数2.2 间接处理:不改变原数据(对数组下标的处理)2.3 实例:鸢尾花数据中对鸢尾花的随机打乱(可以直接用)总结一:函数介绍 np...
    99+
    2023-05-14
    python np.random.permutation np.random.permutation函数
  • C++ 函数参数详解:高阶函数中参数传递的范例
    c++++ 中有两种参数传递机制:传值传递和传址传递。传址传递将对象的内存地址传递给函数,而传值传递将值的副本传递给函数。高阶函数是接受函数作为参数的函数,其参数传递需要特别注意,因为传...
    99+
    2024-04-27
    c++ 函数参数 标准库
  • Python中函数定义及参数实例
    1.函数定义     函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字 ,可以通过函数名在程序的不同地方多次执行(这通常叫函数调用)预定义函数(可以直接使用)自定义函数(自己编写)为什么使用函数?    降...
    99+
    2023-01-31
    函数 实例 定义
  • Python文件读写open函数详解
    前言: open()函数的定义:def open(file, mode='r', buffering=None, encoding=None, errors=None...
    99+
    2024-04-02
  • python函数传参意义示例详解
    目录C++这样的语言用多了之后,在Python函数传递参数的时候,经常会遇到一个问题,我要传递一个引用怎么办? 比如我们想要传一个x到函数中做个运算改变x的值: def cha...
    99+
    2024-04-02
  • Python中函数的参数类型详解
    目录1、Python的函数参数的类型2、Python的必传参数3、关键字参数4、默认参数5、不定长参数1、Python的函数参数的类型 必传参数:调用函数时必须传入的参数,函数定义时...
    99+
    2024-04-02
  • 详解Python函数中的几种参数
    目录1.必需的参数:2关键字参数:3.缺省参数(默认参数):4.不定长参数5.高阶函数总结 1.必需的参数: 必须参数须以正确的顺序传入函数,调用的数量必须和声明时的一样 def...
    99+
    2024-04-02
  • Python函数参数实例分析
    本文小编为大家详细介绍“Python函数参数实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python函数参数实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.函数参数# 1.位置参数...
    99+
    2023-06-28
  • Python中的random函数实例详解
    Python中的random函数 random模块提供生成伪随机数的函数,在使用时需要导入random模块 1. random.random()最基本的随机函数,返回一个[0.0,1...
    99+
    2023-02-22
    Python random函数 Python中的 random
  • python中flatten()参数示例详解
    这篇博客主要写flatten()作用,及其参数的含义 flatten()是对多维数据的降维函数。flatten(),默认缺省参数为0,也就是说flatten()和flatte(0)效...
    99+
    2024-04-02
  • Python中np.random.randint()参数详解及用法实例
    目录可实现功能:np.random.randint() 根据参数中所指定的范围生成随机 整数。参数一、基础用法二、高级用法总结可实现功能: 1.随机生成一个整数。 2.随机生成任意范...
    99+
    2024-04-02
  • Python利用open函数读写文件的示例详解
    目录最简单读取文件操作操作一次文件读写完整流程文件打开方式python提供的读取方法有何意义小案例: 扫描redis配置文件总结在目前的环境中,读取文件应该算是最基本的操作了,pyt...
    99+
    2023-05-16
    Python open实现读写文件 Python open读写文件 Python 读写文件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作