一、文件操作
1、需要的参数:1、文件路径 2、编码方式:utf-8 3、动作(读、写、追加....)
绝对路径下:
f1=open(r'D:学习python.txt',encoding='utf-8',mode='r') #默认是读的方式,mode可以不写
content=f1.read()
print(content)
f1.close()
f1叫文件句柄,文件对象,一般叫文件句柄的居多,不仅可以设置成file,f_handle,file_handle,f_obj,一般约定俗称用f1、f2,f1也是变量,特殊的变量。
open打开的指令,不是python的指令,是windows的指令
windows 默认编码方式gbk,linux默认编码方式utf-8,mac utf-8。
分三步:
1,打开文件,产生文件句柄。--就存放到内存中
2,操作文件句柄。
3,关闭文件。 --如果不关闭,就一直存在内存中
r rb r+,r+b
read read(n) readline readlines for 循环
r :
rb: 非文字类的文件的操作。
unicode ---> bytes encode()
bytes---> unicode decode()
r+,r+b
w
1,没有文件,创建文件,写入内容
2,将原文件所有内容清空,写入新内容。
wb
w+,
w+b
a ab a+,a+b
seek tell truncates,wrateble,readable,等等。
文件的改。
相对路径:
#相对路径
f1=open('log1',encoding='utf-8') #mode可以默认不写,默认是read,文件操作,以读为准
content=f1.readlines()
print(content)
f1.close()
备注:pycharm创建的文件,默认格式是'utf-8'
出现的错误:
SyntaxError: (unicode error) 'unicodeescape' codec
can't decode bytes in position 2-3: truncated UXXXXXXXX escape
f1 = open(r'D:空姐护士老师主妇.txt', encoding='utf-8', mode='r')
# f1 = open('D:\空姐护士老师主妇.txt', encoding='utf-8', mode='r')
EncodeDecodeErorr: 编码错误。
2、rb模式:非文字类的文字的操作(图片、视频等等)
f1=open('log1',mode='rb') #rb模式不需要写编码类型(不加encoding),rb就是bytes类型
content=f1.read(6)
print(content) #b'xe6x88x91xe6x98xaf'
3、文件的读(5种方式)
read:读取全部内容
readline():一行一行读取,读到组合再读就该读空了
readlines():
readline():
f1=open(r'D:学习python.txt',encoding='utf-8',mode='r')
print(f1.readline()) #打印第一行内容
print(f1.readline()) #打印第二行内容
print(f1.readline()) #打印第三行内容
print(f1.readline()) #打印第四行内容
f1.close()
readlines(): #将每一行作为列表的一个元素,并返回给这个列表
f1=open(r'D:学习python.txt',encoding='utf-8',mode='r')
print(f1.readlines())
f1.close() #['想要他们的联系方式吗? ', ' 请加我微信。222222222'] #换行符都出来了,还有指标符
for循环(永远只占一行内存):
f1=open('log1',encoding='utf-8')
for i in f1:
print(i)
f1.close()
read(n):只针对于r模式,按照字符读取
f1 = open('log1', encoding='utf-8')
content = f1.read(6) # r 模式 按照字符读取。
print(content) #我是中国人
f1.close()
contenlist=[]
for i in content:
contenlist.append(i)
print(contenlist) # ['我', '是', '中', '国', '人', ' ']
f1=open('log1',mode='rb')
content=f1.read(6)
print(content)
f1.close() #b'xe6x88x91xe6x98xaf' (十六进制)按照这种输出方式,有时可以看出编码格式,9个字节肯定是utf-8,6个字节不一定,有可能是utf-8,也有可能是gbk
# f1 = open('log1', mode='rb')
# content = f1.read(3) # rb模式 按照字节读取。
# print(content.decode('utf-8'))
# f1.close() #我
#编码的补充:把gbk的bytes类型转换成utf-8的bytes类型,需要先转成unicode,再转成utf-8
s1 = b'xd6xd0xb9xfa'
s2 = s1.decode('gbk')
s3 = s2.encode('utf-8')
print(s3) # b'xe4xb8xadxe5x9bxbd'
s1 = b'xd6xd0xb9xfa'.decode('gbk').encode('utf-8')
print(s1)
执行结果:
b'xe4xb8xadxe5x9bxbd'
b'xe4xb8xadxe5x9bxbd'
r+读写:先读后写,写是在文件后追加。
f1=open('log1',encoding='utf-8',mode='r+')
print(f1.read()) #打印出了f1的内容
f1.write('666')
f1.close() #往f1种写入了666
能不能先写再读呢?就需要seek调整光标,一般都是先读后写,很少有先写后读的
光标 按照字节去运转 seek(数字、字符串、字母,一个字节表示一个,中文是3个字节)
f1 = open('log1', encoding='utf-8', mode='r+')
f1.seek(0,2) 光标调整到内容最后
f1.write('6666')
f1.seek(0)#调整光标 光标调整到内容头部
print(f1.read())
4、文件的写:
w:1、没有文件,会创建文件,写入内容
2、有文件,将原文件所有内容清空,写入新内容
wb模式:1、bytes类型有好多种,带b的不用写编码方式
f1=open('log2',encoding='utf-8',mode='w')
f1.write('我是中国人,我爱五星红旗')
f1.close() #会创建log2文件,并且写入内容
f1=open('log2',encoding='utf-8',mode='w')
f1.write('今天是个好日子')
f1.close() #这个会把之前log2文件内容全部清空,然后重新写入
w+写读模式:写读模式,先写后读,用的不多
f1=open('log2',encoding='utf-8',mode='w+')
print(f1.read()) #这个读出来为空,因为是有文件,文件内容先清空
f1.write('666')
f1.close() #内容为666
a、ab(a在文件追加,ab是bytes模式)
f1=open('log2',encoding='utf-8',mode='a')
f1.write(' 老男孩')
f1.close() #在之前文件内容的基础上换行,写入老男孩
a+:写读模式
f1 = open('log2', encoding='utf-8', mode='a+')
f1.write('fdsafdsafdsagfdg')
f1.seek(0)
print(f1.read())
f1.close()
5、其他操作方法:
#其他操作方法:
read read(n) readline() readlines() write() close
readable writable
tell 告诉指针的位置
f1 = open('log2', encoding='utf-8', mode='w')
f1.write('fdsafdsafdsagfdg')
print(f1.tell())
f1.close()
seek(参数),seek(0,2) 调至最后 按照字节去调整光标
# tell 告诉指针的位置
f1 = open('log2', encoding='utf-8', mode='w')
f1.write('abc')
print(f1.tell())
f1.close() #3
#with open() as:
对f1文件读取,对f2文件写入,如果代码较长,加可以承接。with open() as这种方式不需要手动关闭。
with open('log1',encoding='utf-8') as f1,
open('log2',encoding='utf-8',mode='w') as f2:
print(f1.read())
f2.write('777')
#文件的改:
#文件的改
#1,打开原文件,产生文件句柄。
#2,创建新文件,产生文件句柄。
#3,读取原文件,进行修改,写入新文件。
#4,将原文件删除。
#5,新文件重命名原文件。
import os
with open('file_test', encoding='utf-8') as f1,
open('file_test.bak', encoding='utf-8', mode='w') as f2:
old_content = f1.read()
new_content = old_content.replace('alex','SB')
f2.write(new_content)
os.remove('file_test')
os.rename('file_test.bak','file_test')
把文件中每一行中的SB都改成alex
import os
with open('file_test', encoding='utf-8') as f1,
open('file_test.bak', encoding='utf-8', mode='w') as f2:
for line in f1:
new_line = line.replace('SB','alex')
f2.write(new_line)
os.remove('file_test')
os.rename('file_test.bak','file_test')
执行结果:
alexahahahh
alex好好好好好
alex123