python 文件IO
一、IO、同步IO和异步IO
IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。
比如你打开浏览器,访问新浪首页,浏览器这个程序就需要通过网络IO获取新浪的网页。浏览器首先会发送数据给新浪服务器,告诉它我想要首页的HTML,这个动作是往外发数据,叫Output,随后新浪服务器把网页发过来,这个动作是从外面接收数据,叫Input。所以,通常,程序完成IO操作会有Input和Output两个数据流。当然也有只用一个的情况,比如,从磁盘读取文件到内存,就只有Input操作,反过来,把数据写到磁盘文件里,就只是一个Output操作。
IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。对于浏览网页来说,浏览器和新浪服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据。
由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。举个例子来说,比如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这100M数据可能需要10秒,怎么办呢?有两种办法:
第一种是CPU等着,也就是程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行,这种模式称为同步IO;
另一种方法是CPU不等待,只是告诉磁盘,“您老慢慢写,不着急,我接着干别的事去了”,于是,后续代码可以立刻接着执行,这种模式称为异步IO。
同步和异步的区别就在于是否等待IO执行的结果。好比你去麦当劳点餐,你说“来个汉堡”,服务员告诉你,对不起,汉堡要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场,这是同步IO。
你说“来个汉堡”,服务员告诉你,汉堡需要等5分钟,你可以先去逛商场,等做好了,我们再通知你,这样你可以立刻去干别的事情(逛商场),这是异步IO。
很明显,使用异步IO来编写程序性能会远远高于同步IO,但是异步IO的缺点是编程模型复杂。想想看,你得知道什么时候通知你“汉堡做好了”,而通知你的方法也各不相同。如果是服务员跑过来找到你,这是回调模式,如果服务员发短信通知你,你就得不停地检查手机,这是轮询模式。总之,异步IO的复杂度远远高于同步IO。
操作IO的能力都是由操作系统提供的,每一种编程语言都会把操作系统提供的低级C接口封装起来方便使用,Python也不例外。我们后面会详细讨论Python的IO编程接口。
二、open函数
语法:file object = open(file_name [, access_mode][, buffering])
各个参数的细节如下:
- file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
- access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
- buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
不同模式打开文件的完全列表:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
字符编码:
要读取非UTF-8编码的文本文件,需要给open()
函数传入encoding
参数,遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError
,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()
函数还接收一个errors
参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略。
1 f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
三、file对象属性
name | 描述 |
---|---|
buffer | <_io.BufferedWriter name='test.txt'> |
closed | False |
encoding | 'UTF-8' |
errors | 'strict' |
line_buffering | False |
mode | 'w' |
name | 'test.txt' |
四、file对象方法
name | 描述 |
---|---|
close | <function TextIOWrapper.close> |
detach | <function TextIOWrapper.detach> |
fileno | <function TextIOWrapper.fileno> |
flush | <function TextIOWrapper.flush> |
isatty | <function TextIOWrapper.isatty> |
read | <function TextIOWrapper.read> |
readable | <function TextIOWrapper.readable> |
readline | <function TextIOWrapper.readline> |
readlines | <function TextIOWrapper.readlines> |
seek | <function TextIOWrapper.seek> |
seekable | <function TextIOWrapper.seekable> |
tell | <function TextIOWrapper.tell> |
truncate | <function TextIOWrapper.truncate> |
writable | <function TextIOWrapper.writable> |
write | <function TextIOWrapper.write> |
writelines | <function TextIOWrapper.writelines> |
五、close方法
1、刷新缓冲区里任何还没写入的信息,2、关闭该文件。
1 fd = open("foo.txt", "wb") 2 fd.close()
with方法省去close()
1 with open('/path/to/file', 'r') as f: 2 pass
六、read方法
语法:fileObject.read([count])
调用read()
会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)
方法,每次最多读取size个字节的内容。另外,调用readline()
可以每次读取一行内容,调用readlines()
一次读取所有内容并按行返回list
。因此,要根据需要决定怎么调用。
如果文件很小,read()
一次性读取最方便;如果不能确定文件大小,反复调用read(size)
比较保险;如果是配置文件,调用readlines()
最方便。
七、write方法
语法:fileObject.write(string)
你可以反复调用write()
来写入文件,但是务必要调用f.close()
来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()
方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()
的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with
语句来得保险。
要写入特定编码的文本文件,请给open()
函数传入encoding
参数,将字符串自动转换成指定编码。
1 with open('test.txt', 'w', encoding='GBK') as fd: 2 fd.write('你是哪里人?') 3 4 with open('test.txt', 'r') as fd: 5 print(fd.read()) 6 7 with open('test.txt', 'r', encoding='utf-8', errors='ignore') as fd: 8 print(fd.read())
1 你是哪里人? 2 ˣ
八、文件光标定位,tell函数和seek函数
tell()方法告诉你文件内的当前位置;换句话说,下一次的读写会发生在文件开头这么多字节之后。
seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。
如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
1 fd.tell() 2 fd.seek(0, 0)
转载于:https://www.cnblogs.com/gundan/p/8136979.html
python 文件IO相关推荐
- Python 文件 IO 操作详解
Python 文件 IO 操作详解 1.文件 IO 常用操作 2.文件打开操作 2.1 打开命令 2.2 命令参数 2.2.1 路径 2.2.2 mode 2.2.3 buffering 缓冲区 2. ...
- python 文件 IO 操作
Python 的底层操作 * 其实Python的文件IO操作方法,和Linux底层的差不多 打开 f = open(filename , "r") 后面的 "r" ...
- python文件都是脚本吗_脚本语言系列之Python | Python文件IO
Python是做自动化工作首选的一门语言,与更复杂的语言相比,Python 非常便于快速学习.语法很少,具有良好的 可读性,即使测试工程师们没有丰富的编码经验,也能快速学会:Python 的极简风格对 ...
- Python文件IO基础,看这篇文章就够了!
一切皆文件 Linux的设计哲学之一:一切皆文件. 因此,设备也是文件,对设备的操作可以转换成对文件的I/O操作. 冯诺依曼体系架构 CPU由运算器和控制器组成,计算机的五大部件如下: 运算器:完成各 ...
- python文件IO操作
一.python文件操作的步骤 1.先open打开一个文件 f = open("文件路径","文件访问模式") 2.对文件的操作 3.close关闭打开的文件 ...
- python文件io是啥意思_Python文件IO(普通文件读写)
## 打开一个文件 - fileobj = open(filename, mode) 其中: fileobj是open()返回的文件对象 filename是该文件的字符串名 mode是指明文件类型和操 ...
- Python文件IO处理技巧: 读写、重定向、间隔符、路径、存在性与文件列表
1. 文本数据的读写 open() & write() : rt模式的刷新模式 当我们需要读写各种不同编码的文本数据(如ASCII,UTF-8或UTF-16编码等), 可以直接使用带rt模式的 ...
- Python 文件IO操作
1普通文件的操作: 对应计算机系统中的文件的操作,python提供了一个基本处理函数:open open(file, mode='r', buffering=-1, encoding=None, er ...
- Python 文件 IO
作者: 一去.二三里 个人微信号: iwaleon 微信公众号: 高效程序员 文件是磁盘上的一个指定位置,用来存储相关信息.它用于永久地将数据存储在非易失性的内存中(例如:硬盘). 在 Windows ...
最新文章
- Altium Designer从已有的PCB图中导出封装库
- 如何让你投出的简历得到回应
- OpenGL Texture Coordinates纹理坐标的实例
- 【Linux系统编程】线程同步与互斥:POSIX无名信号量
- jquery ui tabs详解(中文) 【转载】
- 常用的开源镜像网站收集与备忘
- 超越Hadoop的大数据分析之图形处理尺寸
- 【国内首套H3C V7交换机实战课程-1】Comware V7使用、维护与管理-王达-专题视频课程...
- 文本分类(2)-基于传统机器学习方法进行文本分类
- 轻触开关式三功能手电筒3-5W驱动芯片AH3301
- 棋牌麻将 - 基础名词讲解与汇总
- iOS游戏开发之Game Center研究
- hazelcast 搭建_hazelcast教程 入门
- 电子元器件封装设计规范
- 微信小程序wxparse特殊解析空格,解析↵换行符号
- IDEA文档注释(教程+模板)
- Android10 编译错误
- ssm java编程遇到从数据库中查询的时间与存储时间不一致
- 超快速结构感知深度巷道检测(Ultra Fast Structure-aware Deep Lane Detection )
- Vue.js 3.0 学习笔记(十一)Vue Router路由
热门文章
- 【动态规划】计蒜客:蒜头君闯关(最长递增子序列的变体)
- MediaInfo使用简介(新版本支持HEVC)
- jQuery 学习-DOM篇(一):jQuery 创建元素并添加属性
- 交互式反汇编器专业版IDA Pro的一点介绍
- 关于Windows系统中一些实用的修改常识
- connection error mysql_MySQL ConnectionError 安装错误 解决方法
- JAVA多线程→进程与线程、线程周期、实现线程Thread、start()sleep()join()、线程互斥synchronized()锁当前对象this或方法、线程同步wait()notify()
- 第六章节 多态 (多态的概述)
- jquery显示与隐藏效果
- python中文教程github_GitHub - Virile-Tao/python_data_structures_and_algorithms: Python 中文数据结构和算法教程...