python文件操作

python文件操作

文件格式:

打开一个文件,必要的文件的参数:
1. 文件路径
2. 文件编码格式
3. 打开方式mode:(读、写、读写、写读、追加、改。。。)

列:
# f1 = open('log1', encoding='gbk', mode='r') #打开文件
# print(f1.read()) #读取文件
# f1.close() #关闭文件

列子中f1 叫文件句柄,可以叫f,file,file_hander,f_h。。。只要是以f开头都有可能是文件句柄。
Open() 是调用的内置函数,实际是内置汉中调用的windos里面,windos系统的内部的open使用,在windows下是gbk,在linux下是utf-8。
一切对文件进行的操作都是基于文件句柄F1

执行流程:

打开文件并产生文件句柄 —-> 对文件句柄进行操作 ——> 关闭文件句柄

注意:
1.当时是用什么编码写的用什么编码打开
2.在路径层级教多时候有些会被默认特殊处理,所以路径写错会经常报错。
解决办法:
在路径前面加r,表示这个路径仅表示路径,不表示其他
在歧义路径前在多加一个斜杠去除转义
路径分为绝对路径和相对路径需要注意

文件的读、写、追加:

文件的常用操作分为读取,写入,和追加,r/w/a

文件的读(r):
读模式分为r 、rb、r+、r+b

r模式:


rb模式:
带b操作的都是非文字的文件(比如图片视频等)。以byte类型读取,默认自己定义读取方式了
read(n)读出一部分,n等于几就读出几个字节

r+模式:
先读后写

r+b模式:
先度后写处理非文字类的文件

(r)模式下面的读取方式:

read()
全部读出来

read(n)
读出一部分,n等于几就读出几个字符。

.readline()按行读取
默认读取一行,写一行读一行,空行也读取。

.readlines()
全部读出,并放在一个列表中,列表中每一个元素就是一行内容

.for循环读取文件句柄,
其中里面的f1,是被迭代查询出来的,也是按行读取,查出来一条然后释放一条,在继续查询,每次只占一条,最大限度减少内存压力


(R)读取模式举例:

# 1 read() 全读出来
# f1 = open('log1', encoding='utf-8')
# content = f1.read()
# print(content)
# f1.close()

#2 read(n) 读一部分 #默认是r模式
# f1 = open('log1', encoding='utf-8')
# content = f1.read(3)
# print(content)
# f1.close()

# f1 = open('log1', mode='rb')
# print(f1.read(3).decode('utf-8'))
# f1.close()
#r 模式 read(n) n 按照字符读取。
#rb 模式 read(n) n 按照字节读取。


# #3 readline() 按行读取
# f1 = open('log1', encoding='utf-8')
# print(f1.readline())
# print(f1.readline())
# print(f1.readline())
# f1.close()

#4 readlines()
# f1 = open('log1', encoding='utf-8')
# print(f1.readlines())
# f1.close()

# 5 for 循环
# f1 = open('log1', encoding='utf-8')
# for line in f1:
# print(line)
# f1.close()


# f1 = open('1.jpg', mode='rb')
# print(f1.read())
# f1.close()

文件的写:(w)

W模式下如果没有文件,会自动创建文件进行写入
写入前如果文件存在,是先清空再写入新内容。
在写模式下要注意调整光标,如果在写入完成后,指针会在最后一位,再继续读的时候,后面没有任何内容,需要调整光标到初始位置然后读取内容。
seek()——指针调整光标到0
seek(n)——将指针任意调整到某个n的位置
seek(0,2)——指针调整到末尾


写模式分为w wb w+ w+b

w模式:

wb模式:
处理非文字的文件

w+模式:
先写后读

w+b模式:
先写后读,处理非文字类文件


举例:
# f1 = open('log2', encoding='utf-8', mode='w')
# f1.write('桃白白fdksagdfsa')
# f1.close()

# 图片的读取及写入
# f1 = open('1.jpg', mode='rb')
# content = f1.read()

# f2 = open('2.jpg', mode='wb')
# f2.write(content)
# f1.close()
# f2.close()

# w+ 先写后读
# f1 = open('log2', encoding='utf-8', mode='w+')
# f1.write('两款发动机了')
# f1.seek(0) #######此处调整光标指针为0否则在读取的时候没有任何结果,原因写入后指针在最后,再向后读的时候没有内容
# print(f1.read())
# f1.close()


文件的追加:(a)

追加模式分为a ab a+ a+b

a模式:
1.没有原文件,创建新文件写入
2.存在原文件,在文件最后面追加新内容。
3.如果另起一行追加,在前面加\n换行符即可

a+模式:
处理非文字类文件

a+模式:
追加后读,也需要调整指针

a+b模式:
先追加后读非文字类文件

举例:
# a 没有文件,新建文件写入内容
# f1 = open('log3', encoding='utf-8', mode='a')
# # f1.write('alex 666')
# f1.write('\nalex 666')
# f1.close()

# a+
# f1 = open('log3', encoding='utf-8', mode='a+')
# f1.write('python')
# f1.seek(0)
# print(f1.read())
# f1.close()

其他文件操作:

.Readtable()
——判断是否可读

.Writetable()
——判断是否可写

.tell()
——读出光标位置

.seek()
——指针调整光标到0

.seek(n)
——将指针任意调整到某个n的位置

.seek(0,2)
——指针调整到末尾

.truncate()
——将原文件按照字节进行截取
——w会清空文件,r没有写操作权限,所以只能在智能在A模式或者A+模式下使用

举例:
# f1 = open('log3', encoding='utf-8', mode='a+')
# # f1.write('python')
# # print(f1.read())
# print(f1.readable())
# print(f1.writable())
# f1.close()


# f1 = open('log2', encoding='utf-8')
# f1.read()
# print(f1.tell())
# print(f1.seek(0))
# print(f1.seek(0,2))
# f1.seek(12) # 任意调整
# f1.seek(0,2) #光标调整到最后
# f1.seek(0) #光标调整到开头
# print(f1.tell()) # 告诉光标的位置
# f1.close()


# f1 = open('log3', encoding='utf-8', mode='a+')
# f1.truncate(3) # 按照字节对原文件进行截取 必须在a 或 a+ 模式
# f1.close()


其他说明:

read(3):

1. 文件打开方式为文本模式时,代表读取3个字符

2. 文件打开方式为b模式时,代表读取3个字节

其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate

注意:

1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。


With+as用法
with open('文件名',encoding='字符集类型',mode=‘打开方式’)as f1,with open('文件名',encoding='字符集类型',mode=‘打开方式’)as f1,。。。。。。

优点:
1. 不用主动关闭文件句柄
2. 一个with语句中可同时操作多个文件句柄。As一个完成后加一个逗号后面继续接新句柄。

举例:

# with open('log1', encoding='utf-8') as f1,\
# open('log2', encoding='utf-8', mode='w') as f2:
# content = f1.read()
# f2.write(content)

# with open('log1', encoding='utf-8') as f1:
# print(f1.read())
# f1.close()
# pass
# with open('log1', encoding='utf-8',mode='w') as f2:
# f2.write('666')



模拟文件的修改流程:
1. 以读的模式,读出原文件。
2. 以写的模式,打开新文件。
3. 将原文件读出按照要求修改,将修改后的内容写入新文件。
4. 删除原文件
5. 将新文件重命名原文件

举例:

# import os
# with open('file', encoding='utf-8') as f1,\
# open('file.bak', encoding='utf-8', mode='w') as f2:
# old_content = f1.read()
# new_content = old_content.replace('alex', 'SB')
# f2.write(new_content)
#
# os.remove('file')
# os.rename('file.bak', 'file')

使用for循环修改:

# import os
# with open('file', encoding='utf-8') as f1,\
# open('file.bak', encoding='utf-8', mode='w') as f2:
# for line in f1:
# new_line = line.replace('SB','alex')
# f2.write(new_line)
#
# os.remove('file')
# os.rename('file.bak', 'file')

为什么此处写模式能够成功修改,没有清空文件?

原因在没有关闭writ这个文件句柄之前的,多次写操作都是可以写入的

相关推荐