3-02 文件处理

给你一个文件 “联系方式.txt”,如何查看内容?

1.安装文本编辑器软件

2.利用文本编辑器软件打开

3.查看 or 写入

4.保存,关闭

文件操作分为读、写、修改、我们先从读开始学习

f = open(file="E:/鲁佳/python/联系方式.txt",mode ='r',encoding = 'gbk')
data = f.read()
f.close

文件处理——二进制模式 (视频、图片、进行网络传输的文本 用rb模式)

f = open(file="E:/鲁佳/python/联系方式.txt",mode ='rb')
data = f.read()
f.close

print(data)

文件处理——智能检测编码的工具

问:示例2和示例1的区别在哪?

答:在于示例2打开文件时并未指定encoding,这是为何?是因为直接以rb模式打开了文件,rb是指二进制模式,数据读到内存里直接是bytes格式,如果想看内容,还需要手动decode,因此在文件打开阶段,不需要制定编码

问:假如你不知道你要处理的文件是什么编码怎么办呢?

首先安装第三方工具包 chardet

E:\鲁佳\python>pip install chardet
import chardet

f = open(file="E:/鲁佳/python/联系方式.txt",mode ='rb')
data = f.read()
f.close
result = chardet.detect(data)
print(result)

循环文件:

f = open('联系方式.txt',mode = 'r', encoding = 'gbk')

for line in f:
    print(line)

f.close()

结果:(注意:结果之间有空行,print会自动加一个空行)

张瑶 18456898767

王芳 13569876898

杨超 11345566778

文件处理——写模式操作文件, w 不是修改是创建模式, 如果在已有文件上用w,会清空原来的内容

f = open('联系方式.txt',mode = 'w', encoding = 'gbk')
f.write('星星\t18909890988')
f.close()

文件处理——追加模式操作文件(把内容追加到文件尾部)

f = open('联系方式.txt',mode = 'a', encoding = 'gbk')
f.write('\n东来\t18789007657\n')
f.write('天天\t18982564562\n')
f.write('杨英\t13658479875\n')
f.close()

注意:

  • 文件操作时,以'a'或'ab'模式打开,则只能追加,即:在原来内容的尾部追加内容
  • 写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:
  •   ab,写入时需要直接传入以某种编码的0101010,即字节类型
  •   a 和 encoding,写入时需要传入encoding字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的二进制形式

文件处理——混合操作文件

读写混合模式

f = open('联系方式.txt',mode = 'r+', encoding = 'gbk')
data = f.read()
print(data)
f.write('白云\t18789007657\n')
f.write('李文\t18982564562\n')
f.write('杨轻\t13658479875\n')
f.close()

 文件处理——文件操作其他功能

def fileno(self,*args,**kwargs):
#返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到

def flush(self,*args,**kwargs):
#把文件从内存buffer里强制刷新到硬盘

def readable(self,*args,**kwargs):
#判断是否可读

def readline(self,*args,**kwargs):
#只读一行,遇到\r or \n为止

def seek(self,*args,**kwargs):
#把操作文件的光标移到指定位置
#注意seek的长度是按字节算的,字符编码存每个字符所占的字节长度不一样
#如"路飞学成"用gbk存是2个字节一个字,用utf-8就是3个字节

def seekable(self,*args,**kwargs):
#判断文件是否可进行seek操作

def tell(self,*args,**kwargs):
#返回当前文件操作光标位置

def truncate(self,*args,**kwargs):
#按指定长度截断文件,指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全部去掉

def writable(self,*args,**kwargs):
#判断文件是否可写

文件处理——文件修改功能

一、修改原文件方式

复制代码
 1 def alter(file,old_str,new_str):
 2     """
 3     替换文件中的字符串
 4     :param file:文件名
 5     :param old_str:就字符串
 6     :param new_str:新字符串
 7     :return:
 8     """
 9     file_data = ""
10     with open(file, "r", encoding="utf-8") as f:
11         for line in f:
12             if old_str in line:
13                 line = line.replace(old_str,new_str)
14             file_data += line
15     with open(file,"w",encoding="utf-8") as f:
16         f.write(file_data)
17 
18 alter("file1", "09876", "python")
复制代码

二、把原文件内容和要修改的内容写到新文件中进行存储的方式

2.1 python字符串替换的方法,修改文件内容

复制代码
import os
def alter(file,old_str,new_str):
    """
    将替换的字符串写到一个新的文件中,然后将原文件删除,新文件改为原来文件的名字
    :param file: 文件路径
    :param old_str: 需要替换的字符串
    :param new_str: 替换的字符串
    :return: None
    """
    with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
        for line in f1:
            if old_str in line:
                line = line.replace(old_str, new_str)
            f2.write(line)
    os.remove(file)
    os.rename("%s.bak" % file, file)

alter("file1", "python", "测试")
复制代码

2.2 python 使用正则表达式 替换文件内容 re.sub 方法替换

复制代码
1 import re,os
2 def alter(file,old_str,new_str):
3 
4     with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
5         for line in f1:
6             f2.write(re.sub(old_str,new_str,line))
7     os.remove(file)
8     os.rename("%s.bak" % file, file)
9 alter("file1", "admin", "password")
复制代码

猜你喜欢

转载自www.cnblogs.com/echo-kid-coding/p/11243755.html