一,文件操作初识
1.文件名
2.文件路径
绝对路径:从根目录一层层开始找
相对路径:从当前目录开始找
路径问题报错:
1、在路径的最前面加r,对每个反斜杠进行转意:r'd:a.txt'
2、每个都加,变成\,对每个都转意:d:\a.txt
3.打开方式:只读,只写,写读,读写,追加,等等
4.编码方式
Error:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf in position 25: invalid continuation byte
报错原因:编码不一致
#文件操作初识 #例 f = open('d:护士主妇空姐私密联系方式.txt',encoding='utf-8',mode='r') content = f.read() print(content) f.close() ''' f 变量:f_obj,f_handler,f_h,fh,文件句柄 open():为python的内置的系统函数(内部调用的是windows的系统命令,不同操作系统,python会自动识别并调用) 流程: 1.打开文件,产生文件句柄 2.对文件句柄进行操作 3.关闭文件句柄 '''
二,文件编码
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
#若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open('a.txt','r',encoding='utf-8')
三,文件的打开模式
#读
#r:只读 ***** #对于r模式,mode可以默认不写
#例:
f = open('文件操作',encoding='utf-8')
content = f.read()
print(content)
f.close()
# rb:以字节方式读取读,文件操作中凡是带b字母,都是与非文字类文件相关的 ***
#例
f = open('美女1.jpg',mode='rb') #rb模式按照字节读取
content = f.read()
print(content)
f.close()
#r+:读写 *****
#一般情况:先读后追加
#注意:
#不读,光标默认在文件头,后写,会覆盖字符
#先写后读,光标在文件末,再读,读不出数据
例:
f = open('文件操作',encoding='utf-8',mode='r+')
centent = f.read()
print(centent)
f.write('好好好')
f.close()
#r+b 以bytes类型操作的读写,写读,写读模式
#例:
f = open('文件操作',mode='r+b')
content = f.read()
print(content.decode('utf-8'))
a = '老衲好'
f.write(a.encode('utf-8'))
f.close()
#写 #w:只写 *** #没有文件,创建文件也要写 #有文件,先清空,后写入 #例: f = open('文件操作2',encoding='utf-8',mode='w') f.write('深圳市南山区,福田区,罗湖区...') f.close() #wb:以字节方式写 ** f1 = open('美女1.jpg',mode='rb') content = f1.read() f = open('美女2.jpg',mode='wb') f.write(content) f1.close() f.close() #w+:写读 #先清空,后写,光标在文末,再读,无内容 #w+b:写读,以字节形式
#追加 #a:追加 *** # 没有文件,创建文件也要写。 # 有文件,直接在文件的最后面追加。 #例子: f = open('文件操作3',encoding='utf-8',mode=a) f.write(' 南方水土好') f.close() #ab:以字节形式追加 #a+ :先追加后读 #a+b:写读
文件读取的方法:
# 1、read():全部读取
f = open('文件操作',encoding='utf-8',mode='r')
content = f.read()
print(content)
f.close()
# 2、read(n):读取n个字符 f = open('文件操作',encoding='utf-8',mode='r')
content = f.read(10) #读取n个字符,换行符,空格也算字符,r模式按字符读,b模式按字节
print(content)
f.close
# 3、readline():按行读取,读取一行 f = open('文件操作',encoding='utf-8',mode='r')
print(f.readline())
print(f.readline()) #光标下移,读取下一行
# 4,readlines():多行读取 f = open('文件操作',encoding='utf-8',mode='r')
content = f.readlines() #返回一个list
print(content)
f.close
#5.for 循环,读取时值占用一条的内存,句柄f为可迭代的数据,所以f的最小元素为行 f = open('文件操作',encoding='utf-8',mode='r')
for line in f: print(line.strip()) f.close()
# 其他方法:py3.x # seek 调整光标到开始,seek(0) 调整光标到结尾seek(0,2) ***** f = open('文件操作1',encoding='utf-8') f.seek(6) # 按照字节去移动光标 content = f.read() print(content) f.close() # fileno() 文件描述符:文件的内存地址 # flush() 刷新:强制保存 # readable() 判断文件句柄是否可读,返回布尔值 f = open('文件操作1',encoding='utf-8') if f.readable(): content = f.read() print(content) f.close() # writealeb()判断文件句柄是否可写,返回布尔值 f = open('文件操作1',encoding='utf-8') if f.writable(): f.write('123') f.close() #seekable()判断是否可以调整光标,用处不明 #tell()获取光标位置,应用:断点续传***** f = open('文件操作1',encoding='utf-8') f.seek(0,2) # 按照字节去移动光标 print(f.tell()) f.close() #truncate()在原文件截断数据,仅保持从开头至截取处, # 需要支撑写的情况下才能用,writealbe,返回截取的字节数,不能在W模式使用,会先清空原文件,建议r+,a+ f = open('文件操作1',encoding='utf-8',mode='r+') print(f.truncate(6)) f.close()
# 1,主动关闭文件句柄 with open('文件操作2',encoding='utf-8') as f1: print(f1.read()) # 2,开启多个文件句柄。 with open('文件操作2',encoding='utf-8') as f1, open('文件操作3',encoding='utf-8',mode='w') as f2: print(f1.read()) f2.write('666666')
# 文件的改的操作 # 1,以读的模式打开原文件,产生一个文件句柄f1. # 2,以写的模式创建一个新文件,产生一个文件句柄f2. # 3,读取原文件内容,进行修改,并将修改后的写入新文件。 # 4,将原文件删除。 # 5,将新文件重命名成原文件。 # low版 import os with open('alex的深度剖析', encoding='utf-8') as f1, open('alex的深度解析.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('alex的深度剖析') os.rename('alex的深度解析.bak', 'alex的深度剖析') # import os with open('alex的深度剖析', encoding='utf-8') as f1, open('alex的深度解析.bak',encoding='utf-8',mode='w') as f2: for line in f1: new_line = line.replace('SB','alex') f2.write(new_line) os.remove('alex的深度剖析') os.rename('alex的深度解析.bak', 'alex的深度剖析')