python open函数返回值_open函数 · intermediate-python · 看云

python open函数返回值_open函数 · intermediate-python · 看云#open函数#`open`函数[open](http://docs.python.org/dev/library/functions.html#open)函数可以打开一个文件。超级简单吧?大多数时候,我们看到它这样被使用:~~~f=open(‘photo.jpg’,’r+’)jpgdata=f.read()f.close()~~~我现在写这篇文章的原因,是大部分时间我看到`ope…

大家好,又见面了,我是你们的朋友全栈君。

# open函数

# `open`函数

[open](http://docs.python.org/dev/library/functions.html#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](http://docs.python.org/2/library/io.html#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`啦!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141532.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C# 8小特性

    C# 8小特性

    2021年6月13日
    91
  • 安卓版本命名规则_什么是版本号

    安卓版本命名规则_什么是版本号手机软件完全的版本号定义规则:分三项:..,如1.0.0。修改规则:主版本号:功能模块有大的变动,比如增加多个模块或者整体架构发生变化。次版本号:和主版本相对而言,次版本号的升级对应的只是局部的变动。但该局部的变动造成了程序和以前版本不能兼容,或者对该程序以前的协作关系产生了破坏,或者是功能上有大的改进或增强。修订版本号:局部的变动,主要是局部函数的功能改进,或者bug的修正,或者功能的扩充。w…

    2022年9月11日
    0
  • Qt 音乐播放器「建议收藏」

    Qt 音乐播放器「建议收藏」一、实现功能:1、读取歌曲文件,实现歌曲的播放;2、采用QtDesigner实现歌曲的暂停和播放,歌曲名列表和当前播放歌曲名的显示,上一曲和下一曲歌曲的更换,播放模式的设置,音量的改变,歌曲播放进度的改变;3、读取歌词文件,实现歌词的显示;4、利用QSetting增加歌曲文件和歌词文件的设置功能;5、界面汉化;6、使用CSS进

    2022年4月30日
    65
  • 用 PHP和Golang 来刷leetCode 之 无重复字符 最长子串

    用 PHP和Golang 来刷leetCode 之 无重复字符 最长子串

    2022年2月15日
    42
  • 雷柏 V500PRO Win键失效「建议收藏」

    雷柏 V500PRO Win键失效「建议收藏」之前买了一个雷柏V500PRO机械键盘玩游戏,但是2020年国庆后再没有玩过。最近在使用键盘的过程中,发现Win键失效,然后开始找原因。网上很多是在任务管理器、注册表之类的,总感觉不属于我的问题范围。在博客的评论区看到一个关于机械键盘的评论,引起很多人的共鸣,感觉和我遇到的问题应该一样。接着再搜一下关于雷柏V500Win键失效,找到并解决。其他机械键盘,自己搜索。对于雷柏V500PRO,Win键控制快捷键:Fn+Win键。…

    2022年5月27日
    101
  • springboottest 红_解决没有@RunWith 和 @SpringBootTest注解或失效问题[通俗易懂]

    springboottest 红_解决没有@RunWith 和 @SpringBootTest注解或失效问题[通俗易懂]导入别人的项目或者自己想创建一个测试类经常会遇见了这个问题没有@RunWith和@SpringBootTest注解或失效网上搜了搜全是我下面的第一个解决方案第二个才是重点解决方案1添加依赖如果你是springboot项目pom文件中添加org.springframework.bootspring-boot-starter-testtestMaven项目在项目上右键B…

    2022年5月25日
    251

发表回复

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

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