python文件操作全套讲解(二):写入文件

东尧爱分享

这是东尧每天一篇文章的第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读取文件和写文件的相关内容就介绍到这里了,大家操作过程中遇到问题可以留言讨论。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180430G0J5AX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券