【1】文件的读写追加(rwa)
【1.0】基本形式
f = open("d:\python\temp\1.txt",encoding="utf-8") # 读:文件句柄,也可以 f3 = open("1.txt",'r',encoding="utf-8") f1 = open("1.txt",'w',encoding="utf-8") # 写:文件句柄,是创建一个文件,会覆盖现有文件 f2 = open("1.txt",'a',encoding="utf-8") # 追加:文件句柄 f3.close() # 文件关闭 f.read() # 读取文件内容 f.write('111') # 写入内容到文件 f3.closed() # 判断文件是否关闭 print(f3.read(5)) # 读取且移动5个字符,结果:我有一个梦想 =》我有一个梦 print(f3.tell()) # 查看文件句柄指针指向的字符位置,因为用的是utf字符集,所以一个中文占3个字节,结果:15 print(f3.readline().strip()) # 它会读当前行指针到改行行末的数据,结果:我有一个梦想=》想,因为上面的read已经移动指针到这里 print(f3.tell()) # 结果:20,为什么是20?改行我有一个梦想是6个字符,utf就是18,加上readline 换行其实 也是2个字符 f3.seek(0) # 文件句柄指针指向文件开头 print(f3.seekable()) # 判断文件句柄指向是否可以移动,返回bool值 print(f3.read(5)) # 结果:我有一个梦想=》我有一个梦 print(f3.seek(3)) # 当前指针位置移动到第3个字节的位置,因为是utf8所以一个中文占3个字节,这里其实就是移动到了第2个字符的位置 print(f3.readline().strip()) # 结果:有一个梦想 print(f3.flush) # 把内存buffer中的数据刷新同步到磁盘,一般情况下是等文件buffer(可能) 满了才批量刷到磁盘
【1.1】读:f = open("1.txt",'r',encoding="utf-8")
f = open("d:\python\temp\1.txt",encoding="utf-8") # 读:文件句柄,也可以 f3 = open("1.txt",'r',encoding="utf-8") data = f.read() print(f.readable()) # 判断文件句柄指向是否可读,返回bool值 ,# 也可以 data = open("d:\python\temp\1.txt",encoding="utf-8").read() data1 = f.read() print(data,data1) # 为什么data1输出时空的?因为文件里有一个阅读指针,在data的时候已经进行过 f.read(),阅读到文件末尾了,再read()就从获取不到内容了 f.close() # 关闭文件
【1.2】写:f = open("1.txt",'w',encoding="utf-8")
会创建一个空文件
f1 = open("1.txt",'w',encoding="utf-8") # 写:文件句柄,是创建一个空文件,会覆盖现有文件 f1.write("今天天气好晴朗") # 在文件末尾写入 print(f1.writable()) # 判断文件句柄指向是否可写,返回bool值 f1.write("处处好风光~好风光") # 如果这样写,默认会放到同一行,除非在上一行加上换行符 f1.close()
【1.3】追加:f = open("1.txt",'a',encoding="utf-8")
文件存在即追加,文件不存在则新建
f2 = open("1.txt",'a',encoding="utf-8") # 追加:文件句柄 f2.write("你渴望知识吗?") f2.close()
【2】高级查询:文件句柄指针
【2.1】基本遍历
# print(f3.readline()) # 阅读指针当前行,并把文件指针指向下一行 # print(f3.readlines()) # f3.readlines() 把文件内容封装成列表,每行算一个元素,且元素值末尾带有 for line in f3.readlines(): # 遍历文件中的每一行 print(line.strip()) for index,line in enumerate(f3.readlines()): # 只查看第3行 if index == 2: # 因为从0开始,第3行下标就是2 print(line.strip()) for line in f3: # 迭代器 print(line)
【2.2】文件句柄指针位置操作
print(f3.read(5)) # 读取且移动5个字符,结果:我有一个梦想 =》我有一个梦 print(f3.tell()) # 查看文件句柄指针指向的字符位置,因为用的是utf字符集,所以一个中文占3个字节,结果:15 print(f3.readline().strip()) # 它会读当前行指针到改行行末的数据,结果:我有一个梦想=》想,因为上面的read已经移动指针到这里 print(f3.tell()) # 结果:20,为什么是20?改行我有一个梦想是6个字符,utf就是18,加上readline 换行其实 也是2个字符 f3.seek(0) # 文件句柄指针指向文件开头 print(f3.seekable()) # 判断文件句柄指向是否可以移动,返回bool值 print(f3.read(5)) # 结果:我有一个梦想=》我有一个梦 print(f3.seek(3)) # 当前指针位置移动到第3个字节的位置,因为是utf8所以一个中文占3个字节,这里其实就是移动到了第2个字符的位置 print(f3.readline().strip()) # 结果:有一个梦想 print(f3.flush) # 把内存buffer中的数据刷新同步到磁盘,一般情况下是等文件buffer(可能) 满了才批量刷到磁盘
【3】同时多个操作(比如同时读写)
【3.1】读写:一般形式(r+,w+,a+)
f = open('1.txt', 'r+',encoding="utf-8") # 读+写(3.0+只能在文件末尾追加) f = open('1.txt', 'w+',encoding="utf-8") # 写+读,也会有w的特性,会新建文件,如果文件存在则用空白文件覆盖(3.0+只能在文件末尾写入追加) f = open('1.txt', 'a+',encoding="utf-8") # 追加+读
【3.2】二进制读写(rb+,wb+,ab+)
f = open('1.txt', 'ab+') f.write('~~~~~~~11111111111~~~~~~~~~'.encode('utf8')) f.write('~~~~~~~222222222222222~~~~~~~~~'.encode('utf8')) data=f.read() print(data) f.close()
同理 web+ wb rb 等就不用说了吧?
【4】修改文件内容
【4.1】指定字符串替换
""" 如何修改文件? (1)从原文件逐行读 (2)定位是否有到自己修改的位置 如果不是则把该行写入到新文件 如果定位到了,则修改后,把改行写入到新文件 原文: 我有一个梦想 就是飞向海洋 无边无际的海 是我心中的向往 修改: 无边无际的海=》大海啊大海 """ f = open("梦想.txt",'r',encoding='utf-8') f_new = open("new_梦想.txt",'w',encoding="utf-8") for line in f: if "无边无际的海" in line: line = line.replace("无边无际的海","大海啊大海") f_new.write(line)
【4.2】文件操作实现sed
# Auth chaoqun.guo """ 如何修改文件? (1)从原文件逐行读 (2)定位是否有到自己修改的位置 如果不是则把该行写入到新文件 如果定位到了,则修改后,把改行写入到新文件 原文: 我有一个梦想 就是飞向海洋 无边无际的海 是我心中的向往 修改: 无边无际的海=》大海啊大海 """ import sys f = open("梦想.txt",'r',encoding='utf-8') f_new = open("new_梦想.txt",'w',encoding="utf-8") find_str = sys.argv[1] replace_str = sys.argv[2] print(find_str,replace_str) for line in f: if find_str in line: line = line.replace(find_str,replace_str) f_new.write(line) f.close() f_new.close()
sys.argv是什么?参考:https://www.cnblogs.com/aland-1415/p/6613449.html
完成!
【5】使用 with 关键字避免文件忘记 close
# Auth chaoqun.guo # (1)with 语句:为了避免打开文件后忘记关闭 with open('梦想.txt','r',encoding="utf-8") as f: # 代替了 f = open("梦想.txt",'r',encoding='utf-8') for line in f: print(line.strip()) print("-------------------------".center(50,'-')) # (2)with 写多个语句 with open('梦想.txt','r',encoding="utf-8") as f, open('new_梦想.txt','r',encoding='utf-8') as new_f: for line in f: print(line.strip()) for line in new_f: print(line.strip())
【案例】进度条
import sys import time for i in range(50): sys.stdout.write('#') sys.stdout.flush() time.sleep(0.1)