文件处理

Posted 帅气的小虎

tags:

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

文件操作

文件

1操作系统

windows mac Linux

双击文件

硬盘转 磁头读取数据

保存文件

硬盘转 磁头写入数据

我们在操作文件的时候操作的其实是硬盘

\'\'\'文件其实是操作系统暴露给我们可以简单快捷的操作硬盘的接口

python操作文件的方法

绝对路径:非常详细的路径描述,无论是谁都可以找到

相对路径:

open()关键字

.read()关键字

打开文件方法

1, open(\'a,txt\',mode=\'r\')

2, with open(r\'a.txt\',\'r\',encoding=\'utf-8\')as f:

print(f.read)

子代码运行结束之后会自动调用close关闭文件

with open (文件路径,读写模式,编码格式) as 变量名

子代码块

文件路径是必须的 读写模式和编码格式是可选的

如果不指定读写模式,name默认使用r

如果不使用编码格式默认使用gbk

应用程序==========f=文件

操作系统==========

硬盘

换行操作 /

重点

文件的打开模式

控制文件操作的系统

r:(默认)读

w: 写

a 追写

控制文件读写的模式 其中t和b 不能单独使用

t : (默认模式)读写都是以字符串为单位,必须指定encoding参数

b: 读写都是以bytes为单位,只适应与所有文件,一定不能指定encoding参数

 

rt模式 : 只读模式,如果文件不存在则报错,文件指针在文件的开头位置

f=open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\')

res=f.read

f.close(关闭文件)

wt模式:(慎重使用)只写模式,如果文件不存在,则重新创建空文本文件,如果存在,则清空文件,指针处于开头

f=open(\'a.txt\',mode=\'wt\',encoding=\'utf-8\')

f.write()写入关键字

编写程序换行符\\n 由自己指定

wt模式下,在打开了文件不关的情况下,连续的write写入,新写的内容跟在后面。

at模式 只写模式 ,追加写,文件不存在,则创建,文件存在不会清空,指针在尾部

f=open(\'a.txt\',mode=\'ra\',encoding=\'utf-8\'

rb + wb 读写 重建 复制

文件拷贝功能

with open(\'1.mp4\',mode=\'rb\') as f1,open(r\'D:\\ceshi1.mp4\',mode=\'wb\') as f2:

如果文件过大 请使用for 循环单行读取

 

文件操作其他方法

1,读操作

f.read读取所有的内容,执行完该操作后,文件指针会移动到文件末尾

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

f.readlines()读取每一行的内容,存放于列表中

强调: f.read和f.readline都是一次性读取内容,如果内容过大会导致内存溢出,如果还想将内容提取到内存,请使用多次读入,方法如下

with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
   for line in f:
       print(line)
with open(\'1.mp4\',mode=\'rb\') as f:
   while True:
       data=f.read(1024) # 同一时刻只读入1024个Bytes到内存中
       if len(data) == 0:
           break
       print(data)

 

写操作

f.write(\'11111\\n222\\n\')针对文模式的写,需要自己写换行符

f.write(\'111\\n222\\n\'.encode(\'utf-8\'))针对b模式的写,需要自己转换行符,并且必须用utf-8进行字符转换

f.writelines([\'333\\n\',\'444\\n\'])  # 文件模式
f.writelines([bytes(\'333\\n\',encoding=\'utf-8\'),\'444\\n\'.encode(\'utf-8\')]) #b模式

控文件内的指针移动

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

with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\')as f:

data= f.read(3) 读取三个字符

with open(\'a.txt\',mode=\'rb\')as f:

data= f.(read(3)) 读取三个Bytes

之前 文件指针的移动都是有读、写操作控制而被动触发的,弱项读取文件的某一特殊位置,需要用的f.seek方法,主动控制文件内指针的移动,方法如下

f.seek(指针移动的字节数,模式控制):

模式控制:

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

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

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

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

0模式下的使用

00with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
   f.seek(3,0)     # 参照文件开头移动了3个字节
   print(f.tell()) # 查看当前文件指针距离文件开头的位置,输出结果为3
   print(f.read()) # 从第3个字节的位置读到文件末尾,输出结果为:你好
   # 注意:由于在t模式下,会将读取的内容自动解码,所以必须保证读取的内容是一个完整中文数据,否则解码失败
   
with open(\'a.txt\',mode=\'rb\') as f:
   f.seek(6,0)
   print(f.read().decode(\'utf-8\')) #输出结果为: 好

1模式下的使用

# 1模式的使用
with open(\'a.txt\',mode=\'rb\') as f:
   f.seek(3,1) # 从当前位置往后移动3个字节,而此时的当前位置就是文件开头
   print(f.tell()) # 输出结果为:3
   f.seek(4,1)     # 从当前位置往后移动4个字节,而此时的当前位置为3
   print(f.tell()) # 输出结果为:7

2模式的使用

import time

with open(\'access.log\',mode=\'rb\')as f:

f.seek(0,2)

while 1 :

line= f.readline()

文件修改

# 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
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\'))
# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
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\')

 

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

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

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

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

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

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

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