read() 函数:逐个字节或者字符读取文件中的内容
文件以文本模式打开,read() 函数会逐个字符进行读取;文件以二进制模式打开,read() 函数会逐个字节进行读取
file.read([size])
file :表示已打开的文件对象
size :可选参数,用于指定一次最多可读取的字符(字节)个数,省略则默认一次性读取所有内容
read()函数读取文件内容,要求 open() 函数必须以可读默认( r、r+、rb、rb+)打开文件
若open()的打开模式为 w,程序会抛出io.UnsupportedOperation异常,提示文件没有读取权限
在a.txt 同目录下,创建一个py文件
f = open("a.txt",encoding = "utf-8") #以 utf-8 的编码格式打开文件
print(f.read()) #输出读取到的数据
f.close() #关闭文件
YOUChanWill
当操作文件结束后,必须调用 close() 函数手动将打开的文件进行关闭
通过使用 size 参数,指定每次可读取的最大字符(字节)数
f = open("a.txt",encoding = "utf-8")
print(f.read(6)) #指定可读取的最大字符(字节)数
f.close()
YOUCha
size 表示的是一次最多可读取的字符(或字节)数,设置的 size 大于文件中存储的字符(字节)数时不会报错,只会读取文件中所有的数据
二进制格式打开的文件,会逐个字节读取文件中的内容
f = open("a.txt",'rb+')#以二进制形式打开指定文件
print(f.read())
f.close()
b'YOUChanWill'
输出的数据为 bytes 字节串,可以调用 decode() 方法,将其转换成字符串
关于字符串和bytes的转换:
Python学习笔记(二):从数值类型到字符串相关操作
使用read() 函数时,解释器提示UnicodeDecodeError异常,是因为目标文件使用的编码格式和 open() 函数打开该文件时使用的编码格式不匹配
解决方法:
1.将 open() 函数中的 encoding 参数值修改为和目标文件相同的编码格式
2.重新生成目标文件(将该文件的编码格式改为和 open() 函数中的 encoding 参数相同)
3.先使用二进制模式读取文件,然后调用 bytes 的 decode() 方法,使用目标文件的编码格式,将读取到的字节串转换成字符串
f = open("a.txt",'rb+') #以二进制形式打开指定文件,该文件编码格式为 utf-8
byt = f.read()
print(byt)
print("转换后:")
print(byt.decode('utf-8'))
f.close()
b'YOUChanWill'
转换后:
YOUChanWill
readline()和readlines()函数都以“行”作为读取单位,每次都读取目标文件中的一行;读取以二进制格式打开的文件,会以“\n”作为读取一行的标志
readline() 函数:逐行读取文件中的内容,包含最后的换行符“\n”
file.readline([size])
file :表示已打开的文件对象
size :可选参数,用于指定一次最多可读取的字符(字节)个数
readline()函数读取文件内容,要求 open() 函数必须以可读默认( r、r+、rb、rb+)打开文件
f = open("a.txt")
byt = f.readline()
print(byt)
YOUChanWillYOUChanWill
readline() 函数在读取文件中一行的内容时,会读取最后的换行符“\n”
print() 函数输出内容时默认换行,所以输出结果中会多出一个空行
以二进制形式打开文件,限制最多可以读取的字符(字节)数
f = open("a.txt",'rb')
byt = f.readline(6)
print(byt)
b'YOUCha'
这里没有完整读取一行的数据,不会读取到换行符
readlines() 函数:一次性读取文件中多行内容
和不指定 size 参数的 read() 函数类似,readlines() 函数返回是一个字符串列表,每个元素为文件中的一行内容
readlines() 函数在读取每一行时,会包含最后的换行符“\n”
file.readlines()
file 为打开的文件对象
readlines()函数读取文件内容,要求 open() 函数必须以可读默认( r、r+、rb、rb+)打开文件
f = open("a.txt",'rb')
byt = f.readlines()
print(byt)
[b'YOUChanWillYOUChanWill\r\n', b'\r\n']
文件对象本身是可遍历的,可以使用 for 循环来遍历文件内容
import codecs
f = codecs.open("a.py", 'r', 'utf-8', buffering=True) # 指定使用utf-8字符集读取文件内容
for i in f: # 使用for循环遍历文件对象
print(i, end='')
f.close()
YOUChanWillYOUChanWill
codecs模块用作编码转换
使用 list() 函数将文件转换成 list 列表,如同readlines()函数的返回值
import codecs
print(list(codecs.open("a.txt", 'r', 'utf-8', buffering=True)))
['YOUChanWillYOUChanWill']
sys.stdin 是一个类文件对象(类似于文件的对象,Python 的很多 I/O 流都是类文件对象),使用 for 循环遍历 sys.stdin 来获取用户的键盘输入
import sys
for line in sys.stdin: # 使用for循环遍历标准输入
print('用户输入:', line, end='')
youchanwill
用户输入: youchanwill
通过 for 循环来读取用户的键盘输入,用户每输入一行,程序就会输出用户输入的这行
关于for循环:
Python学习笔记(五):字典的基本操作到流程控制
write() 函数:向文件中写入指定内容
file.write(string)
file :已经打开的文件对象
string :表示要写入文件的字符串(字节串,写入二进制文件中)
write() 函数向文件中写入数据,要求 open() 函数必须以 r+、w、w+、a 或 a+ 的模式打开文件,否则会报 io.UnsupportedOperation 错误
不同的文件打开模式,会直接影响 write() 函数向文件中写入数据的效果
f = open("a.txt", 'w')
f.write("写入一行新数据")
f.close()
fi = open("a.txt", 'r')
print(fi.read())
fi.close()
写入一行新数据
打开文件模式中包含 w(写入),向文件中写入内容时,会先清空原文件中的内容,再写入新的内容
f = open("a.txt", 'a')
f.write("\nYOUChanWill")
f.close()
fi = open("a.txt", 'r')
print(fi.read())
fi.close()
写入一行新数据
YOUChanWill
打开文件模式中包含 a(追加),不会清空原有内容,新写入的内容会添加到原内容后边
写入文件完成后,一定要调用 close() 函数将打开的文件关闭,否则写入的内容不会保存到文件中
当写入文件内容时,操作系统不会立刻把数据写入磁盘,而先缓存起来,只有调用 close() 函数,才会把没有写入的数据全部写入磁盘文件中
文件写入数据后,可以调用 flush() 函数,实现将缓冲区的数据写入文件中
f = open("a.txt", 'w')
f.write("写入一行新数据")
f.flush()
fi = open("a.txt", 'r')
print(fi.read())
fi.close()
写入一行新数据
设置 open() 函数的 buffering 参数可以关闭缓冲区,数据可以直接写入文件中
以二进制格式打开的文件,可以不使用缓冲区,写入的数据会直接进入磁盘文件
以文本格式打开的文件,必须使用缓冲区,否则解释器会报 ValueError 错误
f = open("a.txt", 'w',buffering = 0)
f.write("写入一行新数据")
ValueError: can't have unbuffered text I/O
writelines() 函数:将字符串列表写入文件中
f = open('a.txt', 'r')
n = open('b.txt','w+')
n.writelines(f.readlines()) # readlines() 函数在读取各行数据时,读入了行尾的换行符
n.close()
f.close()
writelines() 函数,可以实现将 a.txt 文件中的数据复制到其它文件中
writelines() 函数向文件中写入多行数据时,不会自动给各行添加换行符
close() 函数:用来关闭已打开文件
file.close()
file 表示已打开的文件对象
使用 open() 函数打开的文件,在操作完成之后,一定要调用 close() 函数将其关闭
如果不调用 close() 函数关闭已打开的文件,会导致 write() 或者 writeline() 函数向文件中写数据时写入失败
f = open("a.txt", 'w')
f.write("youchanwill")
虽然解释器不报错,但根本没有写入成功
在向以文本格式(不是二进制格式)打开的文件中写入数据时,出于效率的考虑,会先将数据临时存储到缓冲区中
只有使用 close() 函数关闭文件时,才会将缓冲区中的数据写入文件中
将数据成功写入到文件中,但不想关闭文件,可使用上面提到的 flush() 函数