python中open()与codecs.open()的区别

2023-10-31

   最初的时候,只有open()函数,由于Python2中,编码的冗杂性,所以就有了codecs.open();至于io.open,其实是因为Python 2的open实际上是file模块提供的;而Python 3的open是io模块提供的。然后,Python 2.6引入了这个Python 3的特性,叫做io.open,以便和原来的open相区分。但是,这个Python 2.6的io.open是有问题的,在一些情况下表现很怪异。Python 2.7的io.open就正常了。

例如:

 一些是Python2版本中的open()编码的使用:

      当我们有数据需要保存时,第一时间一般会想到写到一个txt文件中,当然,数据量比较大的时候还是写到数据库比较方便管理,需要进行网络传输时要序列化,json化。下面主要整理一下平时用的最多的写入到文件中,一般以txt结尾,linux里不会以后缀来区分文件类型,后缀可以随便,也可以没有。

      python读写文件估计大家都用open内置函数,或者file这个工厂函数,这两个的效果基本一样。

      打开文件的方式一般为:f=open(file_name,access_mode = 'r',buffering = -1)。file_name就是文件的路径加文件名字,不加路径则文件会存放在python程序的路径下,

access_mode就是操作文件的模式,主要有r,w,rb,wb等,细节网上一大堆,buffering = -1是用于指示访问文件所采用的缓存方式。0表示不缓存;1表示只缓存一行,n代表缓存n行。如果不提供或为负数,则代表使用系统默认的缓存机制。

      打开以后就是写和读的操作。但是用open方法打开会有一些问题。open打开文件只能写入str类型,不管字符串是什么编码方式。例如

>>> fr = open('test.txt','a')
>>> line1 = "我爱祖国"
>>> fr.write(line1)

这样是完全可以的。但是有时候我们爬虫或者其他方式得到一些数据写入文件时会有编码不统一的问题,所以就一般都统一转换为unicode。此时写入open方式打开的文件就有问题了。例如

>>> line2 = u'我爱祖国'
>>> fr.write(line2)

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    fr.write(line2)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
>>>

怎么办,我们可以将上面的line2编码成str类型,但是太麻烦。我们要把得到的东西先decode为unicode再encode为str。。。

input文件(gbk, utf-8...)   ----decode----->   unicode  -------encode------> output文件(gbk, utf-8...)

代替这繁琐的操作就是codecs.open,例如

>>> import codecs
>>> fw = codecs.open('test1.txt','a','utf-8')
>>> fw.write(line2)
>>>

不会报错,说明写入成功。这种方法可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数 是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述 操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。

因此个人建议:
Python3直接用open。
Python2.x下用codecs.open,特别是有中文的情况,然后也可以避免踩到2.6下面io.open的坑。
如果希望代码同时兼容Python2和Python3,那么推荐用codecs.open

文件读写模式 

最为常见的三种模式,见下表,其中模式就是指获取文件对象时传入的参数,最常用的是前三个。  
|模式|描述|  
|:-:|:-:|  
|r|仅读,待打开的文件必须存在|  
|w|仅写,若文件已存在,内容将先被清空|  
|a|仅写,若文件已存在,内容不会清空|  
|r+|读写,待打开的文件必须存在|  
|w+|读写,若文件已存在,内容将先被清空|  
|a+|读写,若文件已存在,内容不会清空|  

如果需要以二进制方式打开文件,需要在mode后面加上字符"b",比如"rb""wb"等


|rb|仅读,二进制,待打开的文件必须存在|  
|wb|仅写,二进制,若文件已存在,内容将先被清空|  
|ab|仅写,二进制,若文件已存在,内容不会清空|  
|r+b|读写,二进制,待打开的文件必须存在|  
|w+b|读写,二进制,若文件已存在,内容将先被清空|  
|a+b|读写,二进制,若文件已存在,内容不会清空|

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中open()与codecs.open()的区别 的相关文章

随机推荐

  • 回归分析中,证明:总离差平方和=回归平方和+误差平方和。

    证明 总离差平方和 回归平方和 误差平方和 S S T S S R S S E S S T S S R S S E SST
  • java内存结构

    一 Java内存分配 1 Java有几种存储区域 寄存器 在CPU内部 开发人员不能通过代码来控制寄存器的分配 由编译器来管理 栈 在Windows下 栈是向低地址扩展的数据结构 是一块连续的内存的区域 即栈顶的地址和栈的最大容量是系统预先
  • Alpine Docker 安装 bash

    Alpine Linux是一个轻型Linux发行版 它不同于通常的Linux发行版 Alpine采用了musl libc 和 BusyBox以减少系统的体积和运行时的资源消耗 Alpine Linux提供了自己的包管理工具 apk 我们可以
  • Scratch精通之积木的使用

    到目前为止 我们已经学习了很多个代码块了 这些代码块可以完成相应的功能 比如 移动10步 等待1秒 等代码块 我们并不知道它们是如何实现移动或等待功能的 我们只知道可以实现角色移动或等待的效果 这就是编程里面说的封装的概念 所谓封装 就是把
  • Distributed Compilation

    Introduction Distributed compilation is a technique that allows developers to compile code in parallel across multiple m
  • STM32——使用cubemx和keil点亮第一个灯

    一 环境 cubemx安装和搭建见博文 链接 STM32CubeMX安装 keil安装见软件安装管家 注意要是MDK版 二 cubemx操作 1 打开cubemx 2 选择ACCESS TO MCU SLCTOR 创建一个新的工程 3 选择
  • 部署Pod非Running状态,describe查看显示node资源不足

    一 node 节点资源不足的几种情况 1 执行kubectl top node 查看是否真的资源不足 2 报资源不足有多种情况 第一种是真的资源不足 第二种可能是Node上没有打Pod的yaml中定义的nodeSelector 标签所以导致
  • python数据表合并、stack函数、数据分块读取

    数据表的合并 stack函数 数据分块读取 1 concat 2 join 3 merge merge类似sql里面的join 连接方式有inner 默认 left right outer几种模式 对应为内连接 左连接 右连接 全连接 In
  • IDEA 2022 创建 Maven Web 项目教程

    新建项目 IDEA上方工具栏点击 文件 gt 新建 gt 模块 此时的目录结构 需要在main文件夹下补全两个文件夹 点击main 右键 gt 新建 gt 文件夹 IDEA已经给我们提示缺失的文件夹了 依次创建就好 创建后目录结构 IDEA
  • 安装完Anaconda后打不开Spyder

    安装完Anaconda后打不开Spyder python anaconda spyder 安装完Anaconda anaconda navigator里面一切正常 launch spyder后出现spyder的图标 但是spyder仍然打不
  • ubuntu下qnx7.0交叉编译qt5.9.7源码

    在CSDN上查阅了大部分qnx7 0平台编译qt源码的博客 都没有详细给出具体过程和报错处理方式 导致博主在编译时遇到诸多问题 耗时两周才成功编译qnx下aarch64架构版本的qt库 尝试过诸多版本的qt编译之后 发现都会编译过程中报错
  • adb logcat输出日志分析和monkey输出日志分析,提交给开发的内容

    对于app测试所获取的日志 主要是为了看程序出现的crash和anr crash 程序崩溃或闪退 一般会给出提示框 程序停止运行 anr 程序无响应 响应延迟 当操作在一段时间内系统无法处理的时候 弹出对话框 程序无响应 是否关闭 手工测试
  • mpvue小程序实战项目开发记录篇(一)

    一 什么是mpvue mpvue是基于 Vue js 的小程序开发框架 从底层支持 Vue js 语法和构建工具体系 修改了 Vue js 的 runtime 和 compiler 实现 使其可以运行在小程序环境中 mpvue官方文档地址
  • mysql一行数据拆分为多行数据(含分隔符的字符串截取)

    实现的SQL SELECT SUBSTRING INDEX SUBSTRING INDEX 7654 7698 7782 7788 help topic id 1 1 AS num FROM mysql help topic WHERE h
  • 微服务为什么一定要用docker

    微服务为什么一定要用docker https blog csdn net iamlake article details 89000465
  • 第20章_瑞萨MCU零基础入门系列教程之DAC输出模拟信号

    本教程基于韦东山百问网出的 DShanMCU RA6M5开发板 进行编写 需要的同学可以在这里获取 https item taobao com item htm id 728461040949 配套资料获取 https renesas do
  • opengl实现bezier、b曲线和曲面,16个控制点的4*4bezier块;最后可以看到茶壶teapot的实现

    1 你的工程可能还不能跑起来 一般的错误按照网页修改就可以了 可是还是会有个bug Error6error C2039 exit is not a member of global namespace 解决方法 a这是编译器的问题 有时候看
  • 在linux命令下如何访问一个url?

    1 elinks lynx like替代角色模式WWW的浏览器 例如 elinks dump http www baidu com 2 wget 这个会将访问的首页下载到本地 root el5 mq2 wget http www baidu
  • cargo 编译 rust 错误解决方法

    项目中一个代码库 之前编译是没有问题 最近出来新的错误 rust sudo make cd rust usr bin python gen c headers py CARGO TARGET DIR home ics liuys dsa d
  • python中open()与codecs.open()的区别

    最初的时候 只有open 函数 由于Python2中 编码的冗杂性 所以就有了codecs open 至于io open 其实是因为Python 2的open实际上是file模块提供的 而Python 3的open是io模块提供的 然后 P