Python文件操作(I/O):相关函数

Python文件操作(I/O):相关函数

关于文件的路径和相关函数

    • Python文件操作(I/O):相关函数
  • 一.read()函数
    • UnicodeDecodeError异常
  • 二.readline()和readlines()函数
    • readline()函数
    • readlines()函数
  • 三.for循环读取文件
  • 四.write()和writelines()函数
    • write() 函数
    • writelines()函数
  • 五.close()函数

一.read()函数

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学习笔记(二):从数值类型到字符串相关操作

UnicodeDecodeError异常

使用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()函数

readline()和readlines()函数都以“行”作为读取单位,每次都读取目标文件中的一行;读取以二进制格式打开的文件,会以“\n”作为读取一行的标志

readline()函数

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()函数

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循环读取文件

文件对象本身是可遍历的,可以使用 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()和writelines()函数

write() 函数

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()函数

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()函数

close() 函数:用来关闭已打开文件

file.close()

file 表示已打开的文件对象

使用 open() 函数打开的文件,在操作完成之后,一定要调用 close() 函数将其关闭
如果不调用 close() 函数关闭已打开的文件,会导致 write() 或者 writeline() 函数向文件中写数据时写入失败

f = open("a.txt", 'w')
f.write("youchanwill")

虽然解释器不报错,但根本没有写入成功

在向以文本格式(不是二进制格式)打开的文件中写入数据时,出于效率的考虑,会先将数据临时存储到缓冲区中

只有使用 close() 函数关闭文件时,才会将缓冲区中的数据写入文件中

将数据成功写入到文件中,但不想关闭文件,可使用上面提到的 flush() 函数

你可能感兴趣的:(Note,Python,python)