with open() as和codecs.open()

2024-01-13 08:58
文章标签 open codecs

本文主要是介绍with open() as和codecs.open(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基础读文件

传统读取文件的方法是先使用Python内置的open函数打开文件,然后标示符’r’表示读,这样,我们就成功地打开了一个文件,获得到一个f文件句柄

f = open('test.txt','r')

如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容

f.read() # 'hello world'

Python把内容读到内存,用一个str字符串表示

type(f.read()) # str

最后一步是是任何语言都一样的操作,调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。

f.close()

如果文件在读取的过程中抛出异常,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:

try: f =open('test1.txt','r')print(f.read())
finally:print('打开失败')f.close()

with open() as 读文件

每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法,同时也解决了异常问题:

with open('test.txt','r') as f :print(f.read()) # hello world

这和前面的try … finally是一样的,但是代码更佳简洁,无论有无异常均可自动调用f.close()方法。

  • 调用read()会一次性读取文件的全部内容,如果文件很大,内存就爆了,所以可以反复调用read(size)方法,每次最多读取size个字节的内容。
  • 调用readline()可以每次读取一行内容。
  • 调用readlines()一次读取所有内容并按行返回list。
    如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
for line in f.readlines():print(line.strip()) # 把末尾的'\n'删掉

基础写文件/with open()as

基本同上

文件读取模式

在这里插入图片描述

codecs.open

有时候我们爬虫或者其他方式得到一些数据写入文件时会有编码不统一的问题,所以就一般都统一转换为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
代替这繁琐的操作就是codecs.open,例如

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

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

这篇关于with open() as和codecs.open()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600914

相关文章

文件权限修改为777,php failed to open stream: Permission denied

记录一次在谷歌云上的异常诡异的事件: 环境 centos7.5 nginx php7.0 mysql 问题: 问题一 我用相同的nginx配置,只是修改了nginx root目录。 打开/var/www/html/ 这个目录就报 2018/06/22 04:35:03 [error] 15840#0: *438 FastCGI sent in stderr: “Primary scr

FFplay源码分析-stream_component_open

《FFmpeg原理》的社群来了,想加入社群的朋友请购买 VIP 版,VIP 版有更高级的内容与答疑服务。 本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。 上一篇文章已经讲解完了 stream_component_op

FFplay源码分析-streams_open

《FFmpeg原理》的社群来了,想加入社群的朋友请购买 VIP 版,VIP 版有更高级的内容与答疑服务。 本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。 如下图所示,本文主要讲解 streams_open() 函数的

FFplay源码分析-avformat_open_input

《FFmpeg原理》的社群来了,想加入社群的朋友请购买 VIP 版,VIP 版有更高级的内容与答疑服务。 本系列 以 ffmpeg4.4 源码为准,主要讲解 ffplay 的 RTMP 协议解析,播放。本文使用的命令如下: ffplay -i rtmp://192.168.0.122/live/livestream 前两篇文章 《FFplay源码分析-rtmp入口》 《FFplay源

libcudart.so.9.0: cannot open shared object file: No such file or directory

使用torch 或者 torchvision的时候,报错:libcudart.so.9.0: cannot open shared object file: No such file or directory 经过gg一下,发现这个错误是 没有正确安装 英伟达的 CUDA 9 工具包。 但我一想 不对!我是服务器上根本没有GPU 根本不需要安装cuda啊! 后来torch官网发现,必须专门指

ubuntu E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)

ubuntu E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) 今天使用三丰云免费云服务器的时候,又遇到奇葩问题,对于别人来说可能特别简单,但是我是个小白,没有学习过linux,所有问题全靠上网搜索。 之前一直用笔记本搭建的服务器,但是24小时开机太费电了,外网访问也是问题,现在用上三丰云的免费服务器太爽了,性能杠杠滴。够我这种初学者用

window.open下载文件后执行回调方法

// 监听下载完成回调let net = window.open('下载地址');net.addEventListener("beforeunload", e => {console.log("回调处理");}); 优点:代码简洁、方便 缺点:点击下载后会新打开一个浏览器窗口 对用户体验要求不高的情况下使用

Open Vswitch 与 网络命名空间

1 命名空间 2 veth pair 3 网络命名空间 4 操作

Open vSwitch 与 OpenFlow

1 Open Vswitch 参考: http://blog.csdn.net/lizheng2300/article/details/54582310

Ollama(docker)+ Open Webui(docker)+Comfyui

Windows 系统可以安装docker desktop 相对比较好用一点,其他的应该也可以 比如rancher desktop podman desktop   安装需要windows WSL 安装ollama docker docker run -d --gpus=all -v D:\ollama:/root/.ollama -p 11434:11434 --name ollama ol