学习知识要善于思考,思考,再思(考)。我就是靠这个方法成为科学家的。——爱因斯坦
open() 方法
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
一般用法:open(file,mode="r")
完整的语法格式:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
file:必须,文件路径(相对路径或者绝对路径)
mode:可选,文件的打开模式
buffering:缓冲
encoding:编码格式,一般使用utf8
errors:报错级别
newline:区别换行符
closefd:传入的file参数类型
mode常用的有:
r 以只读的方式打开文件,文件的指针将会放在文件的开头;这是默认模式。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
还有一个b的模式,是二进制模式,或者wb rb ab如果带有b,说明是和2进制相关。
默认为文本模式,如果要以二进制模式打开,加上 b 。
file对象
file对象使用open函数来创建,下面是file对象常用的函数
1、file.close() 关闭文件,关闭后文件不能再进行读写操作。
2、file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
3、file.read() 从文件读取指定的字节数,如果未给定或为负则读取所有。
4、file.readline() 读取整行,包括“\n字符”
5、file.readlines() 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
6、file.seek() 设置文件当前的位置。
7、file.tell()返回文件的当前位置
8、file.truncate([size]) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
9、file.write() 将字符串写入文件,返回的是写入的字符长度。
10、file.writelines() 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
基于字符read 和 write
最基本的对文件的操作就是在文件中读写数据:
现在打开一个文件以进行写操作:
fileHandle = open ( 'test.txt', 'w' )
‘w'是指文件将被写入数据,语句的其它部分很好理解。下一步就是将数据写入文件:
fileHandle.write ( 'This is a test file.\nReally, it is.' )
这个语句将“This is a test.”写入文件的第一行,“Really, it is.”写入文件的第二行。最后,我们需要做清理工作,并且关闭文件:
fileHandle.close()
正如你所见,在Python的面向对象机制下,这确实非常简单。需要注意的是,当你再次使用“w”方式在文件中写数据,所有原来的内容都会被删除。如果想保留原来的内容,可以使用“a”方式在文件中结尾附加数据:
fileHandle = open ( 'test.txt', 'a' )
fileHandle.write ( '\n\nBottom line.' )
fileHandle.close()
然后我们把写的内容读出来:
fileHandle = open ( 'test.txt' )
print fileHandle.read()
fileHandle.close()
基于行的读写 line:
fileHandle = open ( 'test.txt' )
print fileHandle.readline() # "This is a test."
fileHandle.close()
同时,也可以把内容保存到一个list中:
fileHandle = open ( 'test.txt' )
fileList = fileHandle.readlines()
for fileLine in fileList:
print '>>', fileLine
fileHandle.close()
或者在文件中一次读取几个字节的内容:
fileHandle = open ( 'test.txt' )
print fileHandle.read ( 1 )
fileHandle.seek ( 4 )
print FileHandle.read ( 1 )
随机访问文件中的位置 seek
Python在读取一个文件时,会记住其在文件中的位置,如下所示:
fileHandle = open ( 'test.txt' )
garbage = fileHandle.readline()
fileHandle.readline() # "Really, it is."fileHandle.close()
可以看到,只有第二行显示出来。然而,我们可以让Python从头开始读来解决这个问题:
fileHandle = open ( 'test.txt' )
garbage = fileHandle.readline()
fileHandle.seek ( 0 )
print fileHandle.readline() # "This is a test."
fileHandle.close()
在上面这个例子中,我们让Python从文件第一个字节开始读取数据。所以,第一行文字显示了出来。当然,我们也可以获取Python在文件中的位置:
fileHandle = open ( 'test.txt' )
print fileHandle.readline() # "This is a test."
print fileHandle.tell() # "17"
print fileHandle.readline() # "Really, it is."
二进制方式读写
在Windows和Macintosh环境下,有时可能需要以二进制方式读写文件,比如图片和可执行文件。此时,只要在打开文件的方式参数中增加一个“b”即可:
fileHandle = open ( 'testBinary.txt', 'wb' )
fileHandle.write ( 'There is no spoon.' )
fileHandle.close()
python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。
python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。
import struct
a=12.34
#将a变为二进制
bytes=struct.pack('i',a)
此时bytes就是一个string字符串,字符串按字节同a的二进制存储内容相同。
再进行反操作
现有二进制数据bytes,(其实就是字符串),将它反过来转换成python的数据类型:
a,=struct.unpack('i',bytes)
注意,unpack返回的是tuple
所以如果只有一个变量的话:
bytes=struct.pack('i',a)
那么,解码的时候需要这样
a,=struct.unpack('i',bytes) 或者 (a,)=struct.unpack('i',bytes)
如果直接用a=struct.unpack('i',bytes),那么 a=(12.34,) ,是一个tuple而不是原来的浮点数了。
如果是由多个数据构成的,可以这样:
a='hello'
b='world!'
c=2
d=45.123
bytes=struct.pack('5s6sif',a,b,c,d)
此时的bytes就是二进制形式的数据了,可以直接写入文件比如 binfile.write(bytes)
然后,当我们需要时可以再读出来,bytes=binfile.read()
再通过struct.unpack()解码成python变量
a,b,c,d=struct.unpack('5s6sif',bytes)
'5s6sif'这个叫做fmt,就是格式化字符串,由数字加字符构成,5s表示占5个字符的字符串,2i,表示2个整数等等,下面是可用的字符及类型,ctype表示可以与python中的类型一一对应。
小猿圈python入门文件操作就到这里,有不懂的同学们,可以看一下视频学习,希望跟着python学习的步伐,坚持就是胜利哦,加油~~