首页 > 编程语言 >python open函数

python open函数

时间:2023-02-24 22:13:32浏览次数:32  
标签:文件 jpgdata 函数 编码 python 句柄 mode open

open函数

open 函数可以打开一个文件。超级简单吧?大多数时候,我们看到它这样被使用:

f = open('photo.jpg', 'r+')
jpgdata = f.read()
f.close()

我现在写这篇文章的原因,是大部分时间我看到open被这样使用。有三个错误存在于上面的代码中。你能把它们全指出来吗?如不能,请读下去。在这篇文章的结尾,你会知道上面的代码错在哪里,而且,更重要的是,你能在自己的代码里避免这些错误。现在我们从基础开始:

open的返回值是一个文件句柄,从操作系统托付给你的Python程序。一旦你处理完文件,你会想要归还这个文件句柄,只有这样你的程序不会超出一次能打开的文件句柄的数量上限。

显式地调用close关闭了这个文件句柄,但前提是只有在read成功的情况下。如果有任意异常正好在f = open(...)之后产生,f.close()将不会被调用(取决于Python解释器的做法,文件句柄可能还是会被归还,但那是另外的话题了)。为了确保不管异常是否触发,文件都能关闭,我们将其包裹成一个with语句:

with open('photo.jpg', 'r+') as f:
    jpgdata = f.read()

open的第一个参数是文件名。第二个(mode 打开模式)决定了这个文件如何被打开。

  • 如果你想读取文件,传入r
  • 如果你想读取并写入文件,传入r+
  • 如果你想覆盖写入文件,传入w
  • 如果你想在文件末尾附加内容,传入a

虽然有若干个其他的有效的mode字符串,但有可能你将永远不会使用它们。mode很重要,不仅因为它改变了行为,而且它可能导致权限错误。举个例子,我们要是在一个写保护的目录里打开一个jpg文件, open(.., 'r+')就失败了。mode可能包含一个扩展字符;让我们还可以以二进制方式打开文件(你将得到字节串)或者文本模式(字符串)

一般来说,如果文件格式是由人写的,那么它更可能是文本模式。jpg图像文件一般不是人写的(而且其实不是人直接可读的),因此你应该以二进制模式来打开它们,方法是在mode字符串后加一个b(你可以看看开头的例子里,正确的方式应该是rb)。
如果你以文本模式打开一些东西(比如,加一个t,或者就用r/r+/w/a),你还必须知道要使用哪种编码。对于计算机来说,所有的文件都是字节,而不是字符。

可惜,在Pyhon 2.x版本里,open不支持显示地指定编码。然而,io.open函数在Python 2.x中和3.x(其中它是open的别名)中都有提供,它能做正确的事。你可以传入encoding这个关键字参数来传入编码。
如果你不传入任意编码,一个系统 - 以及Python -指定的默认选项将被选中。你也许被诱惑去依赖这个默认选项,但这个默认选项经常是错误的,或者默认编码实际上不能表达文件里的所有字符(这将经常发生在Python 2.x和/或Windows)。
所以去挑选一个编码吧。utf-8是一个非常好的编码。当你写入一个文件,你可以选一个你喜欢的编码(或者最终读你文件的程序所喜欢的编码)。

那你怎么找出正在读的文件是用哪种编码写的呢?好吧,不幸的是,并没有一个十分简单的方式来检测编码。在不同的编码中,同样的字节可以表示不同,但同样有效的字符。因此,你必须依赖一个元数据(比如,在HTTP头信息里)来找出编码。越来越多的是,文件格式将编码定义成UTF-8

有了这些基础知识,我们来写一个程序,读取一个文件,检测它是否是JPG(提示:这些文件头部以字节FF D8开始),把对输入文件的描述写入一个文本文件。

import io

with open('photo.jpg', 'rb') as inf:
    jpgdata = inf.read()

if jpgdata.startswith(b'\xff\xd8'):
    text = u'This is a JPEG file (%d bytes long)\n'
else:
    text = u'This is a random file (%d bytes long)\n'

with io.open('summary.txt', 'w', encoding='utf-8') as outf:
    outf.write(text % len(jpgdata))

我敢肯定,现在你会正确地使用open啦!

标签:文件,jpgdata,函数,编码,python,句柄,mode,open
From: https://www.cnblogs.com/zuochuang/p/17153343.html

相关文章

  • python学习——【第十三弹】
    前言上一篇文章​​python学习——【第十二弹】​​中学习了python中的深拷贝和浅拷贝,这篇文章接着学习python中的模块。什么是模块在python中,一个文件(以“.py”为后缀名的......
  • 从0到1一步一步玩转openEuler--24 openEuler管理进程-调度启动进程
    操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主要存储,但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户......
  • Rust - 安装环境、基本类型、流程控制、函数、模块、泛型、所有权
    安装环境、基本类型学习Rust语言是公司同事最先开始提议的,准备用接下来的项目试试水,Rust是一个强类型编译型语言,比较偏向底层,所以开启了Rust的探索之旅。环境准备阶段安......
  • python For - Else
    循环是任何语言的一个必备要素。同样地,for循环就是Python的一个重要组成部分。然而还有一些东西是初学者并不知道的。我们将一个个讨论一下。我们先从已经知道的开始。......
  • python lambda表达式
    lambda表达式是一行函数。它们在其他语言中也被称为匿名函数。如果你不想在程序中对一个函数使用两次,你也许会想用lambda表达式,它们和普通的函数完全一样。Lambda表达式......
  • IDApython
    IDApython里面常用的函数指令importidc#对ea所在地址进行反汇编,得到汇编指令字符串idc.GetDisasm(ea)#获取上一条指令地址,返回int类型idc.prev_head(ea)#获取下......
  • python正则表达式替换所有内容并同时保留找到的内容
    除了一些专业的工具,例如ue,大部分变成语言的函数包都挺让人迷惑的。因为的确有许多功能是很常用的,但是他们又不提供,非得要程序员自己去实现,或者是利用三方的包.例如我们会......
  • Mac 创建Python3虚拟环境
    Mac创建Python3虚拟环境1、安装virtualenvpip3installvirtualenv安装virtualenvwrapperpip3installvirtualenvwrapper创建所以.virtualenvs的隐藏文件夹存......
  • const修饰成员函数
    常函数:在成员函数后加const称为常函数常函数内部不能修改成员属性成员属性声明时添加mutable后,在常函数中依然可以修改  2.常对象声明对象时,在......
  • #Python基础 DateFrame 查看数据信息
    一:导入案例数据及X-MIND 二:实例 2.1显示摘要信息  2.2显示描述性统计信息   2.3显示前后n行  2.4显示索引、列信息  2.5显示每列的数据类......