东尧爱分享
这是东尧每天一篇文章的第23天
东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福。
昨天我们已经讲到了文件的读取操作,那么与读取操作相对应的写入操作又该如何操作呢?下面东尧将用各类示例为大家讲解python的写入操作。
1
文件写入操作
* 使用write方法写入字符串
* 使用writelines一次性从序列中写入多个字符串到文件
01
write()方法写入文件数据,需要注意的是换行需要在写入时手动添加换行符:
hello = open('hello.txt','r+')
hello.write('hello world 01')
hello.write('hello world 02')
hello.write('hello world 03\n')
hello.write('hello world 04\n')
hello.write('hello world 05\n')
02
writelines()方法一次性从序列中写入多个字符串到文件:
hello = open('hello.txt','r+')
l1 = ['hello','world','python','seo','sem']
l1 = ['%s\n' % line for line in l1]
hello.writelines(l1)
2
将缓冲区数据写入到文件
使用flush方法可以将缓冲区中的数据写入到文件中
3
关闭文件
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的,否则会造成资源泄漏。使用close()方法关闭文件
4
编码问题
有时候文件内的数据会包含中文,这个时候用上面的方法直接读取就会报错,不能读取,如下图:
hello = open('hello.txt','r+')
print(hello.read())
在python中,要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,使用encoding指定文件的编码格式为utf-8后(encoding='utf-8')就可以读取了:
hello = open('hello.txt','r+',encoding='utf-8')
print(hello.read())
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
5
文件对象的内建方法
方法名
说明
file.close()
关闭文件
file.fileno()
返回文件的描述符
file.flush()
刷新文件的内部缓冲区
file.isatty()
判断file是否是一个类tty设备
file.next()
返回文件的下一行,类似readline,但是没有其它行时会引发异常
file.read(size=-1)
从文件中读取size个字节,为给定或负值的时候表示读取剩余所有字节,然后作为字符串返回
file.truncate(size=file.tell())
截取文件到最大size字节,默认为当前文件位置
file.readline(size=-1)
从文件中读取并返回一行(包括换行符),或返回最大size字节
file.readlines()
读取文件所有行并作为一个列表返回(包含所有换行符)
file.seek(off, whence=0)
在文件中移动文件指针,从whence(0代表文件起始,1代表当前位置,2代表文件末尾)偏移off字节
file.tell()
返回文件指针在当前文件的位置
file.write(str)
向文件写入字符串
file.writelines(seq)
向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象
这里的内建方法刚才上面的示例中我们已经演示了大部分,下面再讲两个比较有意思的方法:truncate()和seek()方法。
文件的截取:file.truncate(size=file.tell())
截取文件到最大size字节,默认为当前文件位置。
hello = open('hello.txt','r+')
print(hello.read())
hello.truncate(35)
可以看到的是,原本文件内5行内容的数据,在执行了truncate()方法后,仅留下了35字节以后的内容,很有意思吧!
读取光标的定位:file.seek(off, whence=0)
我们知道,当用read()读取完一遍文件后,再次执行就无法返回继续从头开始读取了,那么,要使用什么方法能够反复读取,甚至定位读取呢?这个时候seek()方法就可以排上用处了。
hello = open('hello.txt','r+')
print(hello.read())
print(hello.read()) # 这里光标已经在最后,不能继续读取数据了
hello.seek(0) # 将光标定位到开始位置重新读取
print(hello.read())
hello.seek(8) # 将光标定位到第8个位置
print(hello.read()) # 从第8个位置开始读取
6
上下文管理器:with
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用上下文管理器来帮我们自动调用close()方法。
with open(filename, mode) as variable:
# 对文件进行各种操作
示例:
# 打开一个文件然后读取文件中的内容加工之后写入到列表
text = []
with open('1.txt') as f:
for line in f:
text.append(line.strip())
python的上下文管理器会自动的清理一些资源,比如打开的文件和关闭文件,当执行完成上下文管理器的代码之后,文件会被自动的关闭。
在Python中,文件读写是通过open()函数打开的文件对象完成的。所以使用with语句操作文件IO是个好习惯。Python读取文件和写文件的相关内容就介绍到这里了,大家操作过程中遇到问题可以留言讨论。
领取专属 10元无门槛券
私享最新 技术干货