Python中open()函数怎么打开文件,方式有几种
Admin 2022-07-12 群英技术资讯 1759 次浏览
当我们用open()函数去打开文件的时候,有好几种打开的模式。
'r'->只读
'w'->只写,文件已存在则清空,不存在则创建。
'a'->追加,写到文件末尾
'b'->二进制模式,比如打开图像、音频、word文件。
'+'->更新(可读可写)
这个带'+'号的有点难以理解,上代码感受下。
with open('foo.txt', 'w+') as f: f.write('bar\n') f.seek(0) data = f.read()
可以看到,上面这段代码,它不但可以写,还可以读出来。注意要先定位到开头,f.seek(0),不然读出来的是空数据。
一些人可能会有迷惑,既然带'+'号是可读可写,那'w+'跟'r+'有什么不同。
那就是,
'w+'会清空,会创建 (文件已存在则清空,不存在则创建。)
'r+'不清空,不创建
不要用二进制模式打开文本文件
先看下面代码的“诡异”现象。
假设在windows下,我有个f.txt文件,里面的内容是下面这样的。
hello
world
代码一,
with open('f.txt', 'r') as f: print f.readlines() with open('f.txt', 'rb') as f: print f.readlines()
输出
['hello\n', 'world\n']
['hello\r\n', 'world\r\n']
代码二,
with open('f.txt', 'rb') as f: data = f.read() with open('f.txt', 'w') as f: f.write(data)
打开文件,变成了下面这样,
hello^M
world^M
首先,先理解换行符'\n'跟回车符'\r'的概念。
'\n',换行符(LF,Line-Feed ),指新的一行。
'\r',回车符(CR,Carriage-Return),指回到行头。
因为在不同系统下的换行标识是不一样的。
windows->'\r\n'
unix->'\n'
mac->'\r'
这就是为什么windows下的txt在linux打开的时候行尾会有'^M'。
这就是为什么我在linux下跑脚本导出游戏数据下到本地windows打开变成了一行。
其实文本文件也是二进制文件,是文本编码的二进制文件,文本文件对一些不可见字符进行了处理,增加可读性。
在python中,可以通过os.linesep获得当前系统的换行标识。比如在windows下,os.linesep是'\r\n'。
在python中操作换行标识的时候,并不用管是在什么平台下,直接用'\n'就行了,python会自动根据不同系统转成不同标识。
有了上面这些理论依据,就可以解析本文开头代码的“诡异”现象了。
代码一中,用文本模式打开的文件,换行标识会被python处理成'\n',而用二进制模式打开则原封不动。
代码二中,用二进制模式打开,用文本模式写入。二进制打开原封不动还是'\r\n',而文本模式写入的时候因为python会把'\n'转成'\r\n',所以其实就等于是写入了'\r\r\n',于是就多了个'^M'。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
今天我们来说一说Python中如何实现对一个数字开平方。有三种解决办法、下面我们分别来演示,具体方法及代码如下:
第一种,利用functools工具,调用reduce()函数求阶乘。||第二种,使用for循环来求阶乘。||第三种,直接定义一个阶乘函数func(),利用递归的方式来求阶乘即可。
Python的基本语法详解,小编通过实际的案例向大家展示了操作过程,简单易懂,有需要的朋友可以参考了解看看,那么接下来就跟随小编的思路来往下学习吧,希望对大家学习或工作能有帮助。
它的功能与linux的epoll,还是select模块,poll等类似;实现高效的I/Omultiplexing, 常用于非阻塞的socket的编程中;简单介绍一下这个模块,更多内容查看python文档:https://docs.python.org/3/library/selectors.html 1.模块定义了一个BaseSelector的抽象基类,以及它的子类,包括:Sel
这篇文章主要为大家介绍了python网络编程之进程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008