Python-文件处理
一、文件操作的流程
1.打开文件
2.对文件进行操作(读、写、改)
3.关闭文件
#1.带编码方式读文件 f = open(file='D:/文件操作.txt', mode='r', encoding='gbk') # 找到并以只读模式打开文件 data = f.read() # 读取文件并存在内存上 print(data) # 打印读取的文件 f.close() # 关闭文件 #2.未知编码方式时二进制只读 f = open(file='D:/文件操作.txt', mode='rb') # 找到并以只读模式打开文件,以默认的gbk的编码方式读取文件 data = f.read() # 读取文件并存在内存上 print(type(data), data) # 打印读取的文件 data2 = data.decode('gbk') # 需要手动decode 才能显示文本 print(data2) f.close() # 关闭文件
二、基本操作
1.文件打开方式
f=open('路径',‘模式’) #1.文件路径 2.什么方式打开文件。
2. 打开模式:
r ——只读模式——》默认模式——》文件必须存在 ——》不存在程序报错
w——只写模式—— 》 不可读 ——》存在则清空内容——》不存在则创建
a——追加模式 ——》可读 ——》 存在则只追加内容——》不存在则创建
r+——读写模式——》先读完文件,追加到文件后面
w+——写读模式——》先清空文件,再写新的东西
三、读文件
1.带编码方式读
2.不带编码方式读
3.不知道文件编码方式怎么办?
用chardet包
import chardet f = open('D:/文件操作.txt', mode='rb') # 未知文件格式,先通过读二进制方式读取 data = f.read() # 读取数据放到内存中 result = chardet.detect(data) # 通过char det方法检测编码方式 print(result) f.close()
output:
4.循环文件
f = open(file='D:/文件操作.txt', mode='r', encoding='gbk') # 找到并以只读模式打开文件 for line in f: print(line.strip()) # 一次取一行打印,由于print会自动换行,所以去除一下空格 f.close()
四、写文件
#1.指定编码方式写操作 f = open('D:/文件操作1.txt', mode='w', encoding='utf-8') f.write('crm') # 写入字符串 f.close() # 关闭文件 #2.二进制方式写操作 f = open('D:/文件操作2.txt', mode='wb') f.write('crm'.encode('utf-8')) # 写入字符串 f.close() # 关闭文件b
五、追加
#1.mode='a'追加操作 f = open('D:/文件操作1.txt', mode='a', encoding='utf-8') f.write('hahaha') # 写入字符串 f.close() # 关闭文件 #2.mode='ab'二进制方式追加操作 f = open('D:/文件操作2.txt', mode='ab') f.write('hahaha2'.encode('utf-8')) # 写入字符串 f.close()
六、读写模式
f = open('D:/文件操作1.txt', mode='r+', encoding='utf-8') data = f.read() print(data) f.write('\n这是r+的操作') f.close() 输出:
七、写读模式(略:没什么用)
八、文件操作标准化函数:
# def fileno(self, *args, **kwargs): # real signature unknown
# 返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到
#def flush(self, *args, **kwargs): # real signature unknown
# 把文件从内存buffer里强制刷新到硬盘
#flush用法 f = open('f_flush_test.txt', 'w') f.write('abcde') f.flush() # 把内存内容强制刷入硬盘 print(f.readable()) # 判断是否可读,写操作不可读 f.close()
# def readline(self, *args, **kwargs): # real signature unknown
# 只读一行,遇到\r or \n为止
#readline用法 f = open('D:/文件操作.txt', 'r') data = f.readline() # 每次读一行,遇到\n或\r停止 print(data) f.close()
# def readable(self, *args, **kwargs): # real signature unknown
# 判断是否可读
# def writable(self, *args, **kwargs): # real signature unknown
# 判断文件是否可写
# def seekable(self, *args, **kwargs): # real signature unknown
# 判断文件是否可进行seek操作
# #readable writable seekable 用法 f = open('f_flush_test.txt', 'r') #f = open('D:/文件操作.txt', 'r') print('read(1)操作', f.read(1)) # 读一个字符 print('read()操作', f.read()) # 此时光标已经在第一个字符,把光标所在之后的内容读入内存 print('readable()操作', f.readable()) # 判断是否可读,写操作不可读 print('writable()操作', f.writable()) # 判断是否可写,读操作不可写 print('seekable()操作', f.seekable()) # 判断光标是否可移动 f.close()
# def seek(self, *args, **kwargs): # real signature unknown
# 把操作文件的光标移到指定位置
# def tell(self, *args, **kwargs): # real signature unknown
# 返回当前文件操作光标位置
# def truncate(self, *args, **kwargs): # real signature unknown
# 按指定长度截断文件
# *指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。
九、修改文件
1、占内存、不占硬盘——全部读到内存再改
#方法1: # 1.把文本文件整体读进内存。 # 2.通过s.repalce(old,new)把匹配的字符串替换。 # 3.关闭文本文件。 OLD_STR = '哈哈' NEW_STR = '改了' file = 'D:\文件操作.txt' f = open(file, 'r+', encoding='gbk') # 打开文件 str = f.read() # 读取文件到内存 str2 = str.replace(OLD_STR, NEW_STR) print(str2) f.close()
2、占硬盘、不占内存——边读边改
#方法1: # 1.把文本文件整体读进内存。 # 2.通过遍历的方法,把匹配的字符串替换。 # 3.关闭文本文件。 import os OLD_STR = '哈哈' NEW_STR = '改了' file = 'D:\文件操作.txt' file_new = '%s.new' % file f_new = open(file_new, 'w',) f = open(file, 'r', encoding='gbk') # 打开文件 for line in f: # 遍历每一行 if OLD_STR in line: line = line.replace(OLD_STR, NEW_STR) # 把旧文件的数据更新 f_new.write(line) f.close() f_new.close() os.replace(file_new, file) # 通过替换文件方式更新数据