一、write()方法将字符串写入文件,返回的是写入的字符长度。
- write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,
Python字符串可以是二进制数据,而不是仅仅是文字
|。 - 在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。
- write()方法不会在字符串的结尾添加换行符(’\n’):
- 如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not ‘str’。
语法:
fileObject.write( [ string ])
参数
string – 要写入到已打开文件的内容。
返回值
返回的是写入的字符长度。
例子:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
fo = open("foo.txt", "w")
fo.write( "www.runoob.com!\nVery good site!\n")
# 关闭打开的文件
fo.close()
上述方法会创建foo.txt文件,并将收到的内容写入该文件,并最终关闭文件。如果你打开这个文件,将看到以下内容:
$ cat foo.txt
www.runoob.com!
Very good site!
二、writelines() 方法:向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
- writelines() 方法用于向文件中写入一序列的字符串。
- 这一序列字符串可以是由迭代对象产生的,如一个字符串列表。
- 换行需要制定换行符 \n。
语法
fileObject.writelines( [ str ])
参数
str – 要写入文件的字符串序列。
返回值
该方法没有返回值。
实例
以下实例演示了 writelines() 方法的使用:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开文件
fo = open("test.txt", "w")
print ("文件名为: ", fo.name)
seq = ["菜鸟教程 1\n", "菜鸟教程 2"]
fo.writelines( seq )
# 关闭文件
fo.close()
以上实例输出结果为:
文件名为: test.txt
查看文件内容:
$ cat test.txt
菜鸟教程 1
菜鸟教程 2
三、read()方法从文件读取指定的字节数,如果未给定或为负则读取所有。
- read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,
Python字符串可以是二进制数据,而不是仅仅是文字
。
语法:
fileObject.read([size])
参数
size – 从文件中读取的字节数。
返回值
返回从字符串中读取的字节。
实例
以下实例演示了 read() 方法的使用:
文件 runoob.txt 的内容如下:
1:www.runoob.com
2:www.runoob.com
3:www.runoob.com
4:www.runoob.com
5:www.runoob.com
循环读取文件的内容:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开文件
fo = open("runoob.txt", "rw+")
print("文件名为: ", fo.name)
line = fo.read(10)
print ("读取的字符串: %s" % (line))
# 关闭文件
fo.close()
以上实例输出结果为:
文件名为: runoob.txt
读取的字符串: 1:www.runo
四、 readline()方法:读取整行,包括 "\n" 字符。
- readline() 方法用于从文件读取整行,包括 “\n” 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 “\n” 字符。
语法
fileObject.readline([size])
参数
size – 从文件中读取的字节数。
返回值
返回从字符串中读取的字节。
实例
以下实例演示了 readline() 方法的使用:
文件 runoob.txt 的内容如下:
1:www.runoob.com
2:www.runoob.com
3:www.runoob.com
4:www.runoob.com
5:www.runoob.com
循环读取文件的内容:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开文件
fo = open("runoob.txt", "rw+")
print ("文件名为: ", fo.name)
line = fo.readline()
print ("读取第一行 %s" % (line))
line = fo.readline(5)
print ("读取的字符串为: %s" % (line))
# 关闭文件
fo.close()
以上实例输出结果为:
文件名为: runoob.txt
读取第一行 1:www.runoob.com
读取的字符串为: 2:www
五、readlines()函数
- 读取
所有行
并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。 - readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。
- 如果碰到结束符 EOF 则返回空字符串。
语法
fileObject.readlines([sizeint])
参数
无
返回值
返回列表,包含所有的行。
实例
以下实例演示了 readline() 方法的使用:
文件 runoob.txt 的内容如下:
1:www.runoob.com
2:www.runoob.com
3:www.runoob.com
4:www.runoob.com
5:www.runoob.com
循环读取文件的内容:
实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开文件
with open("runoob.txt", "r") as fo:
print ("文件名为: ", fo.name)
for line in fo.readlines(): #依次读取每行
line = line.strip() #去掉每行头尾空白
print ("读取的数据为: %s" % (line))
以上实例输出结果为:
文件名为: runoob.txt
读取的数据为: 1:www.runoob.com
读取的数据为: 2:www.runoob.com
读取的数据为: 3:www.runoob.com
读取的数据为: 4:www.runoob.com
读取的数据为: 5:www.runoob.com
六、flush()函数
- flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
- 一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
语法
fileObject.flush()
参数
无
返回值
该方法没有返回值。
实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开文件
fo = open("runoob.txt", "wb")
print ("文件名为: ", fo.name)
# 刷新缓冲区
fo.flush()
# 关闭文件
fo.close()
以上实例输出结果为:
文件名为: runoob.txt
进度条实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys,time
for i in range(30): #进度条类型
sys.stdout.write("*")
sys.stdout.flush()
time.sleep(0.2)
七、常见错误
第一种场景:在 write 内容后,直接 read 文件输出会为空,是因为指针已经在内容末尾
。
两种解决方式:
其一,先 close 文件,open 后再读取,
其二,可以设置指针回到文件最初后再 read
# -*- coding: UTF-8 -*-
import os;
document = open("testfile.txt", "w+");
print( "文件名: ", document.name);
document.write("这是我创建的第一个测试文件!\nwelcome!");
print(document.tell()); #输出当前指针位置
document.seek(os.SEEK_SET); #设置指针回到文件最初
context = document.read(); #读文件
print(context);
document.close();
第二种场景:
Python 在 Windows 环境下(在 linux 环境下不存在此问题),在 write 后,直接 read, 会出现乱码问题
。如下:
fo = open("foo.txt", "w+")
fo.write('www.runoob.com')
print fo.read()
- 运行结果会出现一堆乱码,我们会初步判断为编码问题, 但其实并不是编码问题, 而是 EOF 的问题,也就是指针的位置问题,
- 当我们以 w+ 开启文件读写模式的时候,由于是 w,所以文件会被清空,也就是文件为空,初始状态指针为 0 ,也就是初始即为 EOF 位置。
- 当我们写入字符串 www.runboon.com 后,指针的位置为 15,文件在缓存中的的内容为 www.runboon.com[EOF],指针的最后位置为 15, 所以直接 read的时候会默认跳过 15,直到读取到了前一个 EOF 为止,所以你会得到缓存中的一堆乱码。
解决方案:
要想在write()后执行read()方法:
需要先执行flush()方法或指定一个文件读取为止(即close())
。
改进以后的代码如下:
fo = open("foo.txt", "w+")
fo.write('www.runoob.com')
fo.flush()
fo.seek(0) #指定指针为止为文件开头
print (fo.read())
读取乱码问题完美解决。