详解Python中open()函数指定文件打开方式的用法

作者:mattkang 时间:2022-12-07 10:22:11 

文件打开方式

当我们用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'。

标签:Python,打开方式
0
投稿

猜你喜欢

  • Python调用SQLPlus来操作和解析Oracle数据库的方法

    2024-01-27 19:17:06
  • W3C发布HTML 5草案 最终版将于2010年敲定

    2008-01-26 19:16:00
  • C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法

    2024-01-14 14:42:05
  • 关于文件命名

    2009-09-18 16:29:00
  • Pytho的HTTP交互httpx包模块使用详解

    2022-11-17 06:03:29
  • Mysql 如何查询时间段交集

    2024-01-22 09:27:32
  • 浅谈Scrapy网络爬虫框架的工作原理和数据采集

    2023-08-24 22:17:21
  • Python中Timedelta转换为Int或Float方式

    2021-01-24 19:46:41
  • Python使用chardet判断字符编码

    2021-05-14 03:03:52
  • 正则给header的冒号两边参数添加单引号(Python请求用)

    2022-10-07 13:59:59
  • python绘图pyecharts+pandas的使用详解

    2022-02-03 18:00:44
  • Pygame实战之实现经典外星人游戏

    2021-05-10 00:31:44
  • Apache DophinScheduler定时调度Python脚本的实现

    2021-06-23 15:02:54
  • ASP中的面向对象类

    2011-04-11 10:34:00
  • 使用canal监控mysql数据库实现elasticsearch索引实时更新问题

    2024-01-20 22:48:39
  • mysql数据如何通过data文件恢复

    2024-01-17 18:48:18
  • Django 项目布局方法(值得推荐)

    2022-08-22 12:44:22
  • Python利用os模块实现自动删除磁盘文件

    2023-04-06 17:04:37
  • python绘制直线的方法

    2022-10-08 20:01:52
  • MySQL的Query Cache原理分析

    2024-01-25 05:20:29
  • asp之家 网络编程 m.aspxhome.com