python:文件操作
知识点概括
practice
1.文件路径
绝对路径和相对路径
1) 绝对路径,从磁盘的根目录寻找 或者 从互联网上寻找一个路径。
确定文件一定在哪里时 可以用绝对。
2)相对路径(用的多). 相对于当前程序所在的文件夹 ../上一层文件夹。
大多数情况下用相对路径
绝对路径:
1 f = open("e:/abc/里皮.txt", mode="r", encoding="gbk") 2 s = f.read() 3 print(s) 4 f.close()
相对路径:
1 #同一文件夹下只写文件名即可, ../表示上一文件夹 2 f = open("你好", mode="r", encoding="UTF-8") 3 s = f.read() #read()文件之后需要赋值给变量 4 print(s) 5 f.close() # 如果没有这句话, 你在下面的程序中如果删除这个文件. 就会报错
文件的for循环
文件是可迭代对象可以用 for 循环 读取文件中全部内容:
1 #读取文件中全部内容 2 f = open("你好", mode="r", encoding="utf-8") 3 for line in f: # 文件是一个可迭代对象 4 print(line.strip()) # 一行一行的处理数据
也可以是如下两种方法:(不常用,因为一直在运行)
1 f = open("你好", mode="r", encoding="utf-8") 2 while 1: 3 s = f.readline().strip() # 一次读一行 4 if s!= "": 5 print("内容是",s) 6 7 f = open("你好", mode="r", encoding="utf-8") 8 lst = f.readlines() #会一直读取 9 print(lst) 10 f.close()
2. mode 用法和区别
r w a r+ w+ a+ rb wb ab r+b w+b a+b
1)r 只读
s=f.read( ) 读取的时所有内容 for line in f: 按行循环
s=f.readline( ) 读取一行的内容
s=f.readlines( ) 读取的内容会放入到列表中,一行表示一个元素
1 f=open('../text/ll',mode='r',encoding='UTF-8') 2 s=f.read() # 3 print(s) 4 f.close() 5 6 f=open('../text/ll',mode='r',encoding='UTF-8') 7 for line in f: # 8 print(line.strip()) 9 f.close()
2) w 只写
带 w 的,会清空原来的,如果文件不存在,会自动创建新的文件。
1 f=open('你好.txt',mode='w',encoding='UTF-8') 2 f.write('jdijdi') #第一次写入,会清空之前的内容 3 f.write('kkkkk') #第二次写入,不会清空上条语句写入的内容 4 f.flush() #刷新 5 f.close() #关闭
3)a 追加写入
默认在结尾处追加,所有的写入换行,需要手动添加 “ \ n "换行符
1 f=open('你好.txt',mode='a',encoding='UTF-8') 2 f.write('jdijdi\n') 3 f.write('kkkkk') 4 f.flush() #刷新 5 f.close()
4) rb wb ab : 带b的处理的是非文本文件,用bytes来处理
当mode中含有b时,不能给定encoding
1 #将图片从C盘移动到E盘 2 f=open('c:/abc.jpg',mode='rb') #这里不能写encoding 3 e=open('e:/abc.jpg',mode='wb') 4 for line in f: #从f中循环,在e盘中写入 5 e.write(line) 6 f.close() 7 e.flush() 8 e.close()
5)r+ (读写) 工作时常用 (最好用的读写同时存在的模式)
读取时,默认光标在最前面,从头开始读
无论光标在哪里,写入时都在结尾处,
除非上来就写入,写在开头替换掉开头原来的内容
1 f=open('你好.txt',mode='r+') 2 s=f.read(3) #读取了3个字符 3 f.write('世界') #写在末尾 4 print(s) 5 6 f=open('你好.txt',mode='r+') 7 f.write('世界') #写在末尾 8 print(s)
6)w+ (写读)
带w的会清空文件中的之前的内容,因此很少用
# 很少用. 因为会清空文件中的内容 f = open("阿西吧", mode="w+", encoding="utf-8") f.write("张云雷也要退出德云社") # 写完之后光标在最后. 读取是没有内容的 f.seek(0) # 移动光标, 移动到开头 s = f.read() print("读取的内容是",s) #读取的内容为空,光标后没有东西 f.flush() f.close()
7)a+ 追加 写/读
光标默认在最后
1 # a+ 2 f = open("你好", mode="a+", encoding="utf-8") 3 f.write("我要加入德云社") #在结尾处写入 4 f.seek(0) #光标移动到开头 5 s = f.read() #从开头读取内容 6 print(s) #打印所有内容 7 f.flush() #刷新 8 f.close()
3.相关操作
1) 光标 f.seek()
开头:f.seek(0) 结尾:f.seek(0,2)
1 #常用的 开头结尾 css中常用 2 f.seek(0) #开头 偏移量是0 3 f.seek(0,2) #结尾 偏移量是0
# 光标位置 f.seek(3) #等于f.seek(3,0) 在开头处偏移量是3个字节即一个字符 f.seek(3,1) #在当前位置偏移量是3 f.seek(3,2) #在结尾处的偏移量是3
1 # 反复读取 2 f=open('你好.txt',mode='r',encoding='utf-8') 3 for line in f: 4 print(line.strip()) 5 f.seek(0) #光标移动到开头 6 for line in f: 7 print(line.strip()) 8 f.close()
2)查询光标位置 f.tell( ) 返回的时seek值 即字节
1 f = open("啊同类个同同同", mode="w", encoding="utf-8") 2 f.write("哇哈哈哈哈压缩盖伦") 3 f.seek(9) 4 print(f.tell()) #9
1 f = open("你好", mode="r", encoding="utf-8") 2 f.seek(3) # 3byte => 1中文 3 s = f.read(1) # 读取一个字符 4 print(f.tell()) # 光标在哪儿??? 如果文件中为汉字 输出为6 5 f.close()
3)截断文件 truncate( )
truncate() 截断文件
默认从文件开头截断到光标位置 删除光标后面的内容
truncate(12) 默认从文件开头截断到参数位置 删除后面的内容
1 # 从文件开头截断到光标位置 2 # 如果给参数. 从头截断到参数位置 3 f = open("你好", mode="w", encoding="utf-8") 4 f.write("哇哈哈哈哈压缩盖伦") 5 f.seek(9) 6 print(f.tell()) 7 f.truncate(12) 8 f.close()
4.修改操作
将日志文件存储为列表形式的记录
ID,name,phone,car
1,alex,10086,特斯拉 2,wusir,10010,劳动而扣分 3,taibai,10000,激动 4,ritian,12345,小黄车
# 将以上给出的日志做成一条条记录存放在列表中
1 lis=[] 2 with open('20180806.log',mode='r',encoding='utf-8') as f: 3 first=f.readline().strip().split() #第一行放入列表中必须用readline() 4 for line in f: #循环文件的行 5 dic={} #用来存放每一行记录 6 ls=line.strip().split(',') #每一行进行切割 7 for i in range(len(first)): 8 dic[first[i]] = ls[i] 9 lis.append(dic) 10 print(lis)
5.修改文件
步骤:1. 引入os模块 import os
2. 打开目标文件, r
3. 打开文件副本, w
4. 从r中读取内容进行修改. 写入到副本中
5. 删除源文件
6. 重命名副本
1 import os 2 with open('你好',mode='r',encoding='utf-8') as f1, \ 3 open('你好_副本',mode='w',encoding='utf-8') as f2: 4 for line in f1: 5 line=line.replace('alex','sba') 6 f2.write(line) 7 os.remove('你好') 8 os.rename('你好_副本','你好')

浙公网安备 33010602011771号