写文件的很多操作,与读文件的操作是相同的,建议先看 读取文本文件
打开文件
读写文件,要先通过内置open()函数打开文件
open('文件路径',mode='模式',encoding='编码')
常用参数说明:
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式,可省略。详细介绍在下面
- encoding: 可选,指定编码,如utf-8,省略时采用系统默认编码,windows默认采用GBK编码
常用模式:
- ‘w’:只写
打开一个文件只用于写入。
如果该文件已存在则打开文件,清空文件内容 并从开头开始编辑。
如果该文件不存在,创建新文件。 - ‘w+’:读写
打开一个文件用于读写。
如果该文件已存在则打开文件,先 清空文件内容 并从开头开始编辑。(也就是说打开文件后读取该文件,内容是空的)
如果该文件不存在,创建新文件。 - ‘a’:追加
打开一个文件用于追加。
如果该文件已存在,文件指针 将会放在文件的 结尾。也就是说,新的内容将会被写入到已有内容之后。不会清空文件
如果该文件不存在,创建新文件进行写入。 - ‘a+’:追加且可读
打开一个文件用于读写。
如果该文件已存在,文件指针 将会放在文件的 结尾。文件打开时会是追加模式。不会清空文件
如果该文件不存在,创建新文件用于读写。
例子:
f=open('d:\\1.txt','w')
f=open('d:\\1.txt','w+',encoding='UTF-8')
关闭
从 读取文件 章节可知,一般情况操作完文件后,应及时关闭
关闭后,将内存中的 数据 立刻 写入 文件中,解释见下面写入文件
有的软件,在运行时, 会一直独占文件 ,这种时候,就 不能关闭 。
如:word、ppt、excel等,在实现某软件服务器时,在运行期间要一直输出日志,要一直独占日志文件,那么运行期间不用关闭
f.close()
异常处理
异常处理同读取文件操作,try...finally...和with语句都适用
写入文件
写入文本文件,先是将内存中的字符进行 编码转换,转换成二进制,然后将其写入到硬盘中
写入文件主要有三种方法
方法1
将字符串写入文件
len=write(str)
参数
str:要写入文件的字符串。
返回值
返回的是写入的字符长度。
例子:
打开文件时指定GBK编码,也是windows系统默认的编码,并将字符串写入文件,代码如下:
with open('c:/users/mym/desktop/2.txt','w',encoding='GBK') as f:
len=f.write("窗前明月光\n")#\n是换行符
print(len)
len=f.write("疑是地上霜\n")
print(len)
len=f.write("举头望明月\n低头思故乡")
print(len)
结果如下:
6
6
11
查看文件内容
python换行符与操作系统换行符
在python中,字符串 \n是换行符,在UNIX、linux中的换行符也是\n,在windows中换行符是\r\n,在写入文件时python根据操作系统,会 自动做转换 ,然后 写入 到文件中
例子2
改造上面的程序,在with语句最后休眠10秒钟,如下:
import time
with open('c:/users/mym/desktop/2.txt','w',encoding='GBK') as f:
len=f.write("窗前明月光\n")
print(len)
len=f.write("疑是地上霜\n")
print(len)
len=f.write("举头望明月\n低头思故乡")
print(len)
time.sleep(10)
在这10秒内,打开文件,文件内容为空,内容为空时因为w模式,会清空文件,虽然写入内容,文件内容没有变化,直到10秒钟后,才能看见内容
注意:
调用 写入 方法并 没有 将字符串立刻写入文件,而是 写入缓冲区中,直到运行 flush() 或 close() 方法或程序 运行结束 后,才会 真正写入文件。
方法2
将序列中的字符串写入到文件,序列必须 全是字符串,如:list、tuple、set 等
writelines( [ str ])
参数:
序列,如:list、tuple、set 。str:要写入的字符串
返回值
无
例子
打开文件时指定UTF-8编码,并将字符串序列写入文件,代码如下:
with open('c:/users/mym/desktop/2.txt','w',encoding='utf-8') as f:
t=('白日依山尽\n','黄河入海流\n')
f.writelines(t)
f.write('\n')
d={'name','张三','age','18'}
f.writelines(d)
执行结果:
白日依山尽
黄河入海流
18张三agename
多执行几次,会发现字典写入的顺序可能发生变化
注意:
同write(), 写入缓冲区
flush()
刷新缓冲区,将 缓冲区中 的数据立刻 写入 文件中
f.flush()
例子
import time
with open('c:/users/mym/desktop/2.txt','w',encoding='utf-8') as f:
f.write('白日依山尽\n黄河入海流\n')
f.flush()
f.write('欲穷千里目\n更上一层楼\n')
time.sleep(10)
休眠10秒,在10秒内,打开文件,可以看到下面内容:
白日依山尽
黄河入海流
因为执行了flush()方法刷新缓冲区,写入文件。10秒后执行结束,再次将缓冲区中的数据写入文件中,最后结果如下:
白日依山尽
黄河入海流
欲穷千里目
更上一层楼
移动文件指针
从读取文件章节可知,有中文时,移动指针可能会造成错误,所以一般不要将文件指针移动到中间位置。移动到头部不会造成错误
感谢:
http://www.runoob.com/python/python-files-io.html
