一、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相关推荐

  1. Python 文件 IO 操作详解

    Python 文件 IO 操作详解 1.文件 IO 常用操作 2.文件打开操作 2.1 打开命令 2.2 命令参数 2.2.1 路径 2.2.2 mode 2.2.3 buffering 缓冲区 2. ...

  2. python 文件 IO 操作

    Python 的底层操作 * 其实Python的文件IO操作方法,和Linux底层的差不多 打开 f = open(filename , "r") 后面的 "r" ...

  3. python文件都是脚本吗_脚本语言系列之Python | Python文件IO

    Python是做自动化工作首选的一门语言,与更复杂的语言相比,Python 非常便于快速学习.语法很少,具有良好的 可读性,即使测试工程师们没有丰富的编码经验,也能快速学会:Python 的极简风格对 ...

  4. Python文件IO基础,看这篇文章就够了!

    一切皆文件 Linux的设计哲学之一:一切皆文件. 因此,设备也是文件,对设备的操作可以转换成对文件的I/O操作. 冯诺依曼体系架构 CPU由运算器和控制器组成,计算机的五大部件如下: 运算器:完成各 ...

  5. python文件IO操作

    一.python文件操作的步骤 1.先open打开一个文件 f = open("文件路径","文件访问模式") 2.对文件的操作 3.close关闭打开的文件 ...

  6. python文件io是啥意思_Python文件IO(普通文件读写)

    ## 打开一个文件 - fileobj = open(filename, mode) 其中: fileobj是open()返回的文件对象 filename是该文件的字符串名 mode是指明文件类型和操 ...

  7. Python文件IO处理技巧: 读写、重定向、间隔符、路径、存在性与文件列表

    1. 文本数据的读写 open() & write() : rt模式的刷新模式 当我们需要读写各种不同编码的文本数据(如ASCII,UTF-8或UTF-16编码等), 可以直接使用带rt模式的 ...

  8. Python 文件IO操作

    1普通文件的操作: 对应计算机系统中的文件的操作,python提供了一个基本处理函数:open open(file, mode='r', buffering=-1, encoding=None, er ...

  9. Python 文件 IO

    作者: 一去.二三里 个人微信号: iwaleon 微信公众号: 高效程序员 文件是磁盘上的一个指定位置,用来存储相关信息.它用于永久地将数据存储在非易失性的内存中(例如:硬盘). 在 Windows ...

最新文章

  1. Altium Designer从已有的PCB图中导出封装库
  2. 如何让你投出的简历得到回应
  3. OpenGL Texture Coordinates纹理坐标的实例
  4. 【Linux系统编程】线程同步与互斥:POSIX无名信号量
  5. jquery ui tabs详解(中文) 【转载】
  6. 常用的开源镜像网站收集与备忘
  7. 超越Hadoop的大数据分析之图形处理尺寸
  8. 【国内首套H3C V7交换机实战课程-1】Comware V7使用、维护与管理-王达-专题视频课程...
  9. 文本分类(2)-基于传统机器学习方法进行文本分类
  10. 轻触开关式三功能手电筒3-5W驱动芯片AH3301
  11. 棋牌麻将 - 基础名词讲解与汇总
  12. iOS游戏开发之Game Center研究
  13. hazelcast 搭建_hazelcast教程 入门
  14. 电子元器件封装设计规范
  15. 微信小程序wxparse特殊解析空格,解析↵换行符号
  16. IDEA文档注释(教程+模板)
  17. Android10 编译错误
  18. ssm java编程遇到从数据库中查询的时间与存储时间不一致
  19. 超快速结构感知深度巷道检测(Ultra Fast Structure-aware Deep Lane Detection )
  20. Vue.js 3.0 学习笔记(十一)Vue Router路由

热门文章

  1. 【动态规划】计蒜客:蒜头君闯关(最长递增子序列的变体)
  2. MediaInfo使用简介(新版本支持HEVC)
  3. jQuery 学习-DOM篇(一):jQuery 创建元素并添加属性
  4. 交互式反汇编器专业版IDA Pro的一点介绍
  5. 关于Windows系统中一些实用的修改常识
  6. connection error mysql_MySQL ConnectionError 安装错误 解决方法
  7. JAVA多线程→进程与线程、线程周期、实现线程Thread、start()sleep()join()、线程互斥synchronized()锁当前对象this或方法、线程同步wait()notify()
  8. 第六章节 多态 (多态的概述)
  9. jquery显示与隐藏效果
  10. python中文教程github_GitHub - Virile-Tao/python_data_structures_and_algorithms: Python 中文数据结构和算法教程...