一、文件操作
open()文件句柄
open()打开一个文件,获取的是文件句柄
f = open("胡辣汤.txt", mode="r", encoding="utf-8") 读取文件中的内容,f 变量,操控 胡辣汤.txt 文件的句柄 read(n) #读取n个字符 content = f.read(3) content = f.read() #一次性全部读取出来
line = f.readline() #读取一行数据 print(line.strip()) #strip()去掉空白,空格 print(line, end="") #也是去掉空白,空格
lst = f.readlines() #一次性全部读取出来,返回的是列表 print(lst)
read和readlines 正常情况下不会用到
文件句柄是一个可迭代的对象
#必须掌握 f = open("胡辣汤", mode="r", encoding="utf-8") for line in f: #读取文件中的内容。 一行一行的读取。每次读取的内容交给前面的变量 print(line, end="")
f.close
二、路径问题
1、绝对路径(当文件路径是固定的时候)
从磁盘根目录找文件。 Windows下用的是c, d, e,f Linux:userinxxxx
2、相对路径(用的多)
相对路径相当于当前程序所在的文件夹
../ 表示上一层文件夹
注意: 转移字符,有固定的含义的。推荐在路径前面加r
f = open(r'E:哈哈 护士模特少妇.txt', mode='r', encoding='utf-8') print(f.read())
三、文件操作的相关模式
1、mode
mode: r(只读), w(只写), a(追加写入)
当mode="w"时每open一次,就会清空一次文件(慎用)
f = open("d:/sylar.txt", mode="w", encoding="utf-8") f.write("周笔畅 ") # 写的时候. 先清空. 再写入. w f.write("胡辣汤 ") f.write("实付款 ") f.flush() f.close()
注意:第一次写的时候,先清空再写入,后续再写入的时候,追加,不再删除
f = open("d:/sylar.txt", mode="a", encoding="utf-8") f.write("娃哈哈") # 追加写 f.write("爽歪歪") f.flush() f.close()
mode: rb(只读), wb(只写), ab(追加写入) b -bytes 读取和写入的都是字节,用来操作非文本文件(图片、音频、视频)
例如:
图片的拷贝
f1 = open("d:/linux学院-桌面背景.jpg", mode="rb") f2 = open("E:/刘伟自拍.jpg", mode="wb") for line in f1: f2.write(line) f1.close() f2.flush() f2.close()
import requests # 网络请求 rs = requests.get("http://pic.netbian.com/uploads/allimg/180906/180605-153622836527b2.jpg") f = open("壁纸.jpg", mode="wb") f.write(rs.content) f.flush() f.close()
mode: r+(读写), w+(写读), a+(追加写读) #同理 r+b,w+b,a+b
r+, 正常的 先读再写,没问题 f = open("person", mode="r+", encoding="utf-8") for line in f: print (line)
f.write("sunjinquan") f.close() 错误的示范 f = open("person", mode="r+", encoding="utf-8") f.write("杨千桦") # 默认如果直接写入的话。 在开头写入。 覆盖开头的内容 content = f.read() print(content) r+ 坑: 不论你读取多少内容。再次写入的时候都是在末尾 f = open("person", mode="r+", encoding="utf-8") info = f.read(3) f.write("胡辣汤") print(info) w+ 很少用 f = open("person", mode="w+", encoding="utf-8") # 先清空。 然后再操作 f.write("你好。 我叫肿瘤君")
f.seek(0) 移动光标到最前面 content = f.read() # 写入东西之后。 光标在末尾。 读取不到内容的 print(content) f.close() a+, 不论光标在何处 写入的时候都是在末尾 f = open("person", mode="a+", encoding="utf-8") f.write("我叫李嘉诚") # 默认写在末尾 content = f.read() print(content) f.close()
2、文件复制
f1 = open(r"c:日记本.txt", mode="r", encoding="utf-8") f2 = open(r"d:日记本.txt", mode="w", encoding="utf-8") for line in f1: #从f1中读取数据 f2.write(line) #写入到f2中 f1.close() f2.close()
四、相关操作
f = open("person", mode="r", encoding="utf-8") info = f.read(3) #读取三个字符 #seek()移动光标 f.seek(3) info = f.read(3)
seek(参数1, 参数2)
参数1表示的是偏移量,移动多少个单位
参数2表示从什么位置进行偏移
0: 开头
1: 当前位置
2: 末尾
把光标移动到文件的开头:seek(0)
把光标移动到末尾:seek(0, 2)
print(f.read(2)) #读取两个字符。 f.seek(0) print(f.read(2)) #读取两个字符,和上次读取的相同 tell() 程序返回当前光标的位置 info = f.read(3) print(info) print(f.tell()) #获取光标位置
truncate() 截取文件,慎用,几乎用不到
尽量不要瞎测试 w, w+, w+b,truncate()
f = open(r"C:Program Files (x86)TencentQQBinQQScLauncher.exe", mode="r+", encoding="utf-8") f.seek(5) # 光标移动到5 f.truncate() # 默认从开头截取到光标位置 # f.truncate(3) # 从头截取到3 f.close()
五、文件修改
import os # 导入os模块 import time # 时间模块 # 优点:不用关闭句柄, 自动关闭连接 with open("唐诗", mode="r", encoding="utf-8") as f1, open("唐诗_副本", mode="w", encoding="utf-8") as f2: for line in f1: line = line.replace("善良", "sb") f2.write(line) time.sleep(5) os.remove("唐诗") # 删除源文件 time.sleep(5) os.rename("唐诗_副本", "唐诗") # 把副本改名成源文件
六、日志处理
示例一:
2018-09-11 00:00:01|刘伟|吃鸡
2018-09-11 00:00:01|刘伟|玩手机
示例二:
时间|姓名|action
2018-09-11 00:00:01|刘伟|吃鸡
2018-09-11 00:00:01|刘伟|玩手机