文件处理

Posted jiangxianseng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件处理相关的知识,希望对你有一定的参考价值。

二、文件处理

1.什么是文件?

操作系统提供的一种调用计算机硬件的的工具, 用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统完成对硬盘的具体操作。

2.为什么要用文件?

需要通过文件来调用硬件和保存数据

3.怎么用文件?

open()

f = open(‘文件路径‘,‘打开文件的模式‘,‘指定的字符编码‘)

f:文件句柄

f.close() # 回收操作系统资源,还有个del.f表示回收变量,这个python解释器内部回收机制会自动回收,这就要求我们,在操作完毕文件后,一定要记住f.close(),虽然我们如此强调,但是大多数读者还是会不由自主地忘记f.close(),考虑到这一点,python提供了with关键字来帮我们管理上下文。

文件路径:

相对路径:在当前文件同目录及以下都可以

相对路径:D:项目路径day08a.txt

文件上下文处理:

with open(‘文件路径‘,‘打开文件的模式‘,‘指定的字符编码‘)as if:

文件打开模式:(纯净模式)

  • r:只读

1.只能读,不能写

2.如果文件不存在的话,就会报错

  • w:只写:(慎用)

1.只能写,不能读

2.如果文件不存在的话,会创建新的文件

3.如果文件存在的话,先清空原内容再重新写入

  • a:追加写:

    1.只能写,不能读件

    2.如果文件存在的话,会在原数据的末尾添加新数据

补充:r+,w+,a+

表示可读可写,其他都一样

文件处理模式:

  • t:文本模式

    只能与rwa连用

    默认情况下,是rt模式

    必须指定encoding参数

    强调:t 模式只能用于操作文本文件,无论读写,都应该以字符串为单位,而存取硬盘本质都是二进制的形式,当指定 t 模式时,内部帮我们做了编码与解码

  • b:bytes模式

    只能与rwa连用

    处理二进制数据

    一定不能指定encoding参数

    强调:b模式对比t模式 1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便 2、针对非文本文件(如图片、视频、音频等)只能使用b模式

文件处理的内置方法:

  • f.read() # 读文件,一次性读出所有数据

    with open(‘b.txt‘,‘r‘,encoding=‘utf-8‘)as f:   print(f.read())

    f.readline() # 读取一行内容,光标移动到第二行首部

    f.readlines() # 将数据全部读入内存,以换行符分割,存入列表

    with open(‘b.txt‘,‘r‘,encoding=‘utf-8‘)as f:   print(f.readlines())
       
    输出结果:[‘你好啊帅哥 ‘, ‘sean是个DSB‘]

    f.readable() # 是否可读

  • f.write # 写文件,针对文本模式和b模式的写,需要自己写换行符

    with open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)as f:
    print(f.write(‘你好啊帅哥‘))   # 带上print返回值是五个字符

     

    f.writable # 是否可写

    f.writelines # 相当于for +write

    with open(‘b.txt‘,‘w‘,encoding=‘utf-8‘)as f:
      f.writelines([‘你好啊帅哥 ‘,‘sean是个DSB‘])  # 输入一个可迭代对象,然后依次输入,也可以加换行符

    for i in f :i是可迭代对象

4.文件内光标的移动

大前提:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位

with open(‘b.txt‘,‘r‘,encoding=‘utf-8‘)as f:   print(f.read(3))   # 只读取三个字符
   
with open(‘b.txt‘,‘rb‘)as f:
print(f.read(3))  # 只读取三个bytes,而不是三个bit
?

f.seek(参数offset,参数whence):

参数offset:相对偏移度(针对的是字节) # utf-8中中文是三个字节,英文一个字节,gbk中中文两个字节,英文一个字节

参数whence:模式控制

0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的

1: 该模式代表指针移动的字节数是以当前所在的位置为参照的

2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的

强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

f.tell():指示当前光标所在的位置,可以打印出来

f.encoding:表示当前文件是以什么编码方式打开文件

4.文件的修改

1.第一种方式

文件a.txt内容如下
张一蛋     山东    179    49    12344234523
李二蛋     河北    163    57    13913453521
王全蛋     山西    153    62    18651433422
?
# 执行操作
with open(‘a.txt‘,mode=‘r+t‘,encoding=‘utf-8‘) as f:
   f.seek(9)
   f.write(‘大家‘)
   
# 文件修改后的内容如下
张大家     山东    179    49    12344234523
李二蛋     河北    163    57    13913453521
王全蛋     山西    153    62    18651433422
?
# 强调:
# 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容
# 2、内存中的数据是可以修改的

2.第二种方式

# 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件 
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
?
with open(‘db.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as f:    data=f.read()
with open(‘db.txt‘,mode=‘wt‘,encoding=‘utf-8‘) as f:    f.write(data.replace(‘kevin‘,‘SB‘))

3.第三种方式

# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名 
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os with open(‘db.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as read_f,        open(‘.db.txt.swap‘,mode=‘wt‘,encoding=‘utf-8‘) as wrife_f:    
   for line in read_f:       wrife_f.write(line.replace(‘SB‘,‘kevin‘)) os.remove(‘db.txt‘)
os.rename(‘.db.txt.swap‘,‘db.txt‘)

 

以上是关于文件处理的主要内容,如果未能解决你的问题,请参考以下文章

常用python日期日志获取内容循环的代码片段

处理屏幕旋转上的片段重复(带有示例代码)

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

你如何在 python 中处理 graphql 查询和片段?

如何有效地打开 30gb 的文件并处理其中的片段而不减慢速度?

是否有在单个活动中处理多个片段的 Android 设计模式?