文件的读取——open
打开文件需要三步:打开 -> 操作 -> 关闭
同时,打开文件时,需要注意文件路径可能有转义字符的情况:
#注意文件路径可能有转义字符的情况,如以下写法,会报错
file1 = open('d:\note1.txt') #有转义字符\n,会报错,提示Invalid argument
#解决方法1:多加一个\
file1 = open('d:\\note1.txt')
#解决方法2:用/替换\
file1 = open('d:/note1.txt')
#解决方法3:前方加一个r,让后方的转义字符都不生效
file1 = open(r'd:\note1.txt')
#关闭文件
file1.close()
判断文件对象拥有的权限
file = open("d:/note1.txt")
print(file.readable())#判断是否拥有可读权限 True or False
print(file.writable())#判断是否拥有可写权限
文件定位
tell()方法:可获取文件的当前位置
seek(m,n)方法:可改变当前文件的位置
——m表示偏移量,>0代表向右移动,<0代表向左移动
——n指定开始移动字节的参考位置(参数为1或2时,只有在rb[二进制]模式下才生效)
0:移动指针位置到文件开头
1:不移动指针,使用当前位置作为参考位置
2:移动指针到末尾
file1 = open('d:/note1.txt','rb')#文件中共有10个字符(0-9)
print(file1.tell())#输出:0,打印指针的位置,在第0位
file1.seek(6,0)#表示从文件开头,向右偏移6位
print(file1.tell())#输出:6
file1.seek(2,1)#表示从指针当前位置,向右偏移两位
print(file1.tell())#输出:8
file1.seek(-1,2)#表示从文件末尾,向左偏移1位
print(file1.tell())#输出:9
文件读写模式:
r为读取模式,w为写入模式,a为追加模式,不能同时进行读和写
r模式
——r模式为默认模式
——只能读,不能写
——若读取的文件不存在,则报错
#读取模式r,若读取的文件不存在,则报错
file1 = open('d:/note1.txt')#不加读写模式的参数,则默认为读取模式
file2 = open('d:/note1.txt','r')#r为读取模式,只能读,不能写
print(file2.readable())#输出:True
print(file2.writable())#输出:False
print(file2.read())#读取文件内容,并打印出来
file2.close()
w模式
——只可写,不可读
——会清空文件之前的内容
——若文件不存在,会创建新文件并写入
#写入模式w,若写入的文件不存在,会自动创建一个文件,不会进行报错
file1 = open('d:/note1.txt','w')#w为写入模式,只能写入,不能读取,且为清空后重新写入
print(file1.readable())#输出:False
print(file1.writable())#输出:True
file1.write('hello')
file1.close()
a模式
——只可写
——追加写入,不会清空文件之前内容
——若文件不存在,会创建新文件并写入
#追加模式a,若写入的文件不存在,会自动创建一个文件,不会进行报错
file1 = open('d:/note1.txt','a')#a为追加写入模式,不会清空之前文件内的内容
print(file1.readable())#输出:False
print(file1.writable())#输出:True
file1.write('world')
file1.close()
当需要同时进行读取和写入时,可以使用r+、w+、a+
r+模式
——可读,可写
——若文件不存在,则报错
——默认情况下,从文件所在指针位置开始写入
#r+从当前位置开始写入,若后面有内容,则进行覆盖,但不会全部清空
file1 = open('d:/note1.txt','r+')
file1.write('my name is Jewel')
print(file1.tell())#打印指针位置,输出16
file1.seek(0)#使指针位置回到第0位
print(file1.read())#输出:my name is Jewel,若seek(0)不写,则读取不到任何内容
print(file1.tell())#输出:16,读取后,指针位置又到了16
file1.seek(0)
file1.write('花花')#从指针所在位置开始写入
print(file1.tell())#打印指针位置,输出4,一个汉字占两个字节
file1.seek(0)
print(file1.read())#输出:花花ame is Jewel
file1.close()
w+模式
——可读,可写
——会清空文件之前的内容
——若文件不存在,会创建新文件并写入
file1 = open('d:/note1.txt','w+')
file1.write('ABCDE')
file1.seek(0)
print(file1.read())#输出:ABCDE
a+模式
—— 可读,可写
——文件不存在,不报错
——不会清空文件内容,从末尾进行追加写入
file1 = open('d:/note1.txt','a+')#原文件有5个字符,ABCDE
print(file1.tell())#输出:5
file1.seek(0)#将指针移至开头
file1.write('12345')#写入新的内容
file1.seek(0)#将指针移至开头
print(file1.read())#输出:ABCDE12345
with open
with open方法,要注意缩进,可以不用写close()方法,其他与open方法用法基本一致
with open('d:/note1.txt','w+') as file1:
file1.write('ABCDE')
file1.seek(0)
print(file1.read())#输出:ABCDE
with open方法可以同时打开多个文件
with open('d:/note1.txt','w+') as file1,open('d:/note2.txt','w+') as file2:
file1.write('ABCDE')
file1.seek(0)
file2.write('12345')
file2.seek(0)
print(file1.read())#输出:ABCDE
print(file2.read())#输出:12345
read()、readline()、readlines()的不同用法:
——read()读取文件全部内容
——readline()读取一行内容,可以加一个参数,表示读取几个字符
——readlines()读取整个文件,返回值是一个列表,每个元素是一行
#向目标文件写入多行数据
with open('d:/note1.txt','w+') as file1:
file1.write('''ABCDE
12345
abcde
54321''')
file1.seek(0)
print(file1.read())#输出:按格式输出文本全部内容
file1.seek(0)
print(file1.readline(2))#输出:AB
file1.seek(0)
print(file1.readlines())#以列表形式输出
#['ABCDE\n', '12345\n', 'abcde\n', '54321']