Python-文件处理
Posted OYxing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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) # 通过替换文件方式更新数据
以上是关于Python-文件处理的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 多处理进程中运行较慢的 OpenCV 代码片段
你如何在 python 中处理 graphql 查询和片段?