python进⾏⽂件读写实例_Python基础_⽂件读写
⼀、I/O操作概述
I/O概述:
I/O在计算机中时指Input/Output,也就是Stream的输⼊与输出。我们通常说的输⼊与输出其实在操作系统中都是相对于内存⽽⾔
的,InputStream(输⼊流)是指数据从外部(⽹络、键盘、I/O设备)流进内存,OutputStream正好与之相反,数据从内存流出到外部。程序运⾏时,数据都是在哎内存中驻留,由CPU这个超级快的计算核⼼来执⾏,涉及到数据交换的地⽅就需要IO接⼝。
IO接⼝的提供以及⾼级编程语⾔中的IO操作的实现:
操作系统⼗个通⽤的软件程序,其通⽤⽬的如下:
硬件驱动、进程管理、内存管理、⽹络管理、安全管理、I/O管理
操作系统屏蔽了底层硬件,向上提供通⽤接⼝。因此,操作I/O的能⼒是由操作系统提供的,每⼀种编程语⾔都会把操作系统提供的低级C 接⼝封装起来供开发者使⽤,Python也不例外。
⼆、⽂件读写实现原理和操作步骤
1.⽂件读写实现原理:
由于操作I/O的能⼒是由操作系统提供的,且操作系统不允许普通程序直接操作磁盘,所以读写⽂件时需要操作系统打开⼀个对象,这个对象通常被称之为⽂件描述符--file descriptor,简称fd,这个就是我们在程序中要操作的⽂件对象。
通常⾼级编程语⾔会提供⼀个内置的函数,通过接收‘⽂件路径’、‘⽂件打开模式’等参数来打开⼀个⽂件对象,并返回该⽂件对象的⽂件描述符。因此通过这个函数我们就可以获取到要操作的⽂件对象,在Python中这个函数叫open(),在PHP中叫fopen()
2.⽂件读写操作步骤:
不同编程语⾔读写⽂件的操作步骤⼤体都⼀样,都分为以下⼏步:
1)打开⽂件,获取⽂件描述符;
2)操作⽂件描述符--读/写;
3)关闭⽂件。
3.需要注意的是:
⽂件读写操作完成后,应该及时关闭。⼀⽅⾯,⽂件对象会占⽤操作系统的资源,另⼀⽅⾯,操作系统对同⼀时间能够打开的⽂件描述符的数量是有限的,在linux操作系统上可以通过ulimit -n来查看这个现实数量。如果不能及时关闭⽂件,还可能造成数据丢失,因为将数据写⼊⽂件时,操作系统不会⽴即把数据写⼊磁盘,⽽是先把数据放到内存缓存区异步写⼊磁盘。当调⽤close⽅法时,操作系统才会保证把没有写⼊磁盘的数据全部写⼊到磁盘,否则可能会丢失数据。
三、Python3中⽂件打开模式
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
打开⽂件的参数通常有:⽂件路径名称、mode参数(即打开模式)、编码模式...
这⾥需要搞清楚的就是mode参数,也就是我们使⽤什么模式打开⼀个⽂件:
Python3源码中时这样解释的:
Python3源码⽂件其实对⽂件的打开模式进⾏了详细的英⽂阐述,这⾥⾮常建议⼤家⾃⼰打开builtins.py⽂件⾃⾏查看,我相信研究看懂的远远⽐看别⼈写的⽂章描述的更加深刻。
这⾥只是粘贴⼀部分打开模式的简单描述部分:
========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
'r'      open for reading (default)
'w'      open for writing, truncating the file first
'x'      create a new file and open it for writing
'a'      open for writing, appending to the end of the file if it exists
'b'      binary mode
't'      text mode (default)
'+'      open a disk file for updating (reading and writing)
python怎么读的'U'      universal newline mode (deprecated)
========= ===============================================================
接下来我们队⼏个常见且重要的模式进⾏中⽂解析:
打开模式
描述
r
以只读模式打开⽂件,并将⽂件指针指向⽂件开头;如果⽂件不存在则报错。
w
以只写模式打开⽂件,并将⽂件指针指向⽂件开头;如果⽂件存在则将其情况并写⼊,如果⽂件不存在则创建
a
以只追加写模式打开⽂件,并将⽂件指针指向⽂件末尾;如果⽂件不存在则创建。
r+
在r的基础上增加可写功能
w+
在w的基础上增加可读功能
a+
在a的模式上增加可读功能
b
读写⼆进制⽂件(默认是t,表⽰⽂本模式),需要与上⾯⼏种模式搭配使⽤,如:ab,wb,ab
x
创建⼀个新⽂件再打开它写⼊;如果⽂件已存在则报错。
思考1:r+、w+和a+都可以对⽂件进⾏读写,他们有何区别?
会覆盖当前⽂件指针所在位置的字符,如原来⽂件内容是“Hello World”,以r+模式打开⽂件写⼊“hi”则⽂件内容变成“hillo World”打开模式
详细描述
r+
会覆盖当前⽂件指针所在位置的字符,如原来⽂件内容是“Hello World”,以r+模式打开⽂件写⼊“hi”则⽂件内容变成“hillo World”
w+
w+在打开⽂件时就会先将⽂件内清空,再进⾏写⼊。
a+
该模式只能写在⽂件末尾,也就是在⽂件末尾进⾏追加写⼊。
思考2:为何要定义这些模式?为什么不能像word⽂档意义打开它之后既可读⼜可写还可以修改呢?
问题答案参考⽹上:
跟安全有关,有这种观点的⼤部分是做运维的朋友,他们认为这就像linux上的rwx(读、写、执⾏)权限。
跟操作系统内核管理I/O的机制有关,有这种观点的⼤部分是做C开发的,特别是与内核相关的开发⼈员。为了提⾼读写速度,要写⼊磁盘的数据会先放进内存缓冲区,之后再回写。由于可能会同时打开很多⽂件,当要回写数据时,需要遍历以打开的⽂件判断是否需要回写。他们认为如果打开⽂件时指定了读写模式,那么需要回写时,只要去查以“可写模式”打开的⽂件就可以了。
四、Python⽂件操作实例
读取⽂件open_test.py,该⽂件的字符编码为utf-8
Python3实现:
输出结果:
这⾥需要注意⼀点就是,我们在读写⽂件时候,特别是在读的时候⼤部分情况,如果⽂件路径不正确或者⽂件不存在,也就是不到⽂件,⼜或者是在进⾏⽂件操作时候出现I/O错误,就会报错。此时如果要保证代码的健壮性最好加上finally来实现错误捕捉以及及时关闭⽂件对象(优化代码如下):
输出结果:
上⾯关闭⽂件的代码有时候很容易忘记,所以我们接下来使⽤Python with⽅法来完成⾃动关闭⽂件:
输出结果:
可以看到在with语句中⽂件时没有关闭的,只有出了with语句后⽂件会⾃动关闭
五、Python⽂件读取相关⽅法
对⽂件的读取操作需要将⽂件中的数据加载到内存中,⽽在上⾯所⽤到的read()⽅法会⼀次性的把⽂件中所有的内容全部加载到内存中。这显然是不合理的,如果我们读取的是⼀个⼤⽂件,有⼏个G的⽂件时,必然会耗光机器的内存或者直接报错,所以肯定有⼀些其他的读取⽅法来解决:
⽅法
描述
read()
⼀次性读取⽂件所有内容
read(size)
每次最多读取指定长度内容,在Python2中size指定是字节长度,⽽在Python3中size指定为字符长度readlines()
⼀次性读取⽂件所有内容,按⾏返回⼀个list
readline()
每次只读取⼀⾏内容
此外还有两个关于⽂件指针位置的⽅法:
⽅法
描述
seek()
将⽂件指针移动到指定字节位置
tell()
实例⼀:
输出结果:
实例⼆:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。