文件的输入输出
文件:数据持久化最简单的类型,也叫平面文件(flat file)。它仅仅是一个文件名下的字节流,把数据从一个文件读入内存,然后从内存写入文件。
读一个文件之前需要打开它,之后可以调用函数来读写数据,最后需要关闭文件。
fileobj = open(filename,mode)
fileobj 是open()返回的文件对象;
filename 是该文件的字符串名;
mode 是指明文件类型和操作的字符串;
mode的第一个字母表明对其的操作:
r 表示读模式
w 表示写模式。如果文件不存在则新创建,如果存在则重写新内容
x 表示文件不存在的情况下新创建并写文件
a 表示如果文件存在,在文件末尾追加写内容
mode 的第二个字母是文件类型:
t (或省略)代表文本类型
b 代表二进制文件
使用write()写文件
>>>poem="""There was a young lady named Bright,\
whose speed was far faster than light;\
She started one day \
In a relative way,\
And returned on the previous night."""
>>> len(poem)
167
>>> fout = open('relativity','wt') #文件默认放在python的根目录下D:\python3
>>> fout.write(poem)
167
>>> fout.close()
>>> fout = open('relativity1','wt')
>>> print(poem,file=fout) # 169 print()默认会在每个参数后添加空格,在每行结束处添加换行。它在文件relativity1中默认添加了一个换行。
>>> fout.close()
使用如下参数,保证print()与write()有同样的输出:
sep分隔符:默认是一个空格 ‘ ‘
end 结束字符:默认是一个换行符 ‘\n’
>>> fout = open('relativity2','wt')
>>> print(poem,file=fout,sep='',end='') #167
>>> fout.close()
>>>
如果源字符串非常大,可将数据分块,直到所有字符被写入:
>>> fout = open('relativity3','wt')
>>> size = len(poem)
>>> offset = 0
>>> chunk = 100
>>> while True:
if offset > size:
break
fout.write(poem[offset:offset+chunk])
offset+=chunk
100
67
>>> fout.close()
如果‘relativity’文件已经存在,可使用模式x 避免重写文件,还可加入一个异常处理:
>>> try:
fout = open(‘relativity’,’xt’)
fout.write(‘stomp stomp stomp’)
except FileExistsError:
print(‘relativity already exists!. That was a close one.’)
使用read()、readline()或者readlines()读文本文件
>>> fin = open('relativity','rt')
>>> poem = fin.read()
>>> fin.close()
>>> len(poem)
167
>>>
可设置最大的读入字符数限制read()函数一次返回的大小,然后把每一块拼接成原来的字符串
>>> poem=''
>>> fin = open('relativity','rt')
>>> chunk = 100
>>> while True:
fragment = fin.read(chunk) #read会记住已读取得位置
if not fragment: # 读到文件结尾之后,再次调用read()会返回空字符串(‘’),if not fragment条件被判为False
break
poem += fragment
>>> fin.close()
>>> len(poem)
167
也可使用readline()每次读入文件的一行,通过追加每一行拼接成原来的字符串poem:
>>> poem = ''
>>> fin = open('relativity','rt')
>>> while True:
line = fin.readline() #对一个文本文件,即使空行也有1个字符长度(换行字符’\n’)
if not line: #当line非空时,返回True,当文件读取结束,readline()返回空字符串,返回为False
break
poem += line
>>> fin.close()
>>> len(poem)
167
读取文本文件最简单的方式是使用一个迭代器(iterator),它会每次返回一行。
>>> poem = ''
>>> fin = open('relativity','rt')
>>> for line in fin:
poem += line
>>> fin.close()
>>> len(poem)
167
>>>
函数readlines()调用时每次读取一行,并返回单行字符串的列表。
使用write()写二进制文件
如果文件模式字符串中包含’b’,那么文件会以二进制模式打开,这种情况下,读写的是字节而不是字符串。
>>> bdata = bytes(range(0,256))
>>> len(bdata)
256
>>> fout = open('bfile','wb')
>>> fout.write(bdata)
256
>>> fout.close()
使用read()读二进制文件
>>> fin = open('bfile','rb')
>>> bdata = fin.read()
>>> len(bdata)
256
>>> fin.close()
使用with自动关闭文件
忘记关闭已打开的文件,函数结束时会被关掉。Python的上下文管理器(context manager)会清理一些资源,例如打开的文件,应该强制剩下的所有写操作完成后再关闭文件。它的形式为:with expression as variable:
>>> with open(‘relativity’,’wt’) as fout:
fout.write(poem)
完成上下文管理器的代码后,文件会被自动关闭
使用seek()改变位置
函数tell()返回距离文件开始处的字节偏移量,函数seek()允许跳转到文件其他字节偏移量的位置。
>>> fin = open('bfile','rb')
>>> fin.tell()
0
>>> fin.seek(255)
255
用第二个参数调用函数seek():seek(offset,origin)
如果origin等于0(默认为0),从开头偏移offset个字节;
如果origin等于1,从当前位置处偏移offset个字节;
如果origin等于2,距离最后结尾处偏移offset个字节;
这些值也在标准os模块中被定义:
>>> os.SEEK_SET
0
>>> os.SEEK_CUR
1
>>> os.SEEK_END
2