一、文件处理流程

1、打开文件,得到文件句柄,并赋值给一个变量
2、通过句柄对文件进行操作
3、关闭文件


python 文件处理 replace python 文件处理详解_python

计算机系统分为:计算机硬件,操作系统,应用程序三部分。

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程
1 # open()函数:用于打开一个文件,并返回相应的 文件对象 (file object)。若无法打开该文件,则会抛出 OSError。open函数会检索当前系统的字符编码。windows编码为‘GBK’,所以,open函数会使用"GBK"进行解码。我们在操作文件的时候需指定解码,
2 # 首先创建一个文件,然后使用open函数打开
3 f = open('file.txt',encoding="utf-8")  #使用open函数打开文件
4 data = f.read()  #拿到文件后,加载到内存中,执行.read()功能
5 print(data)      #输出结果
6 f.close()        #关闭文件

示例1

 

 二、语法

内置函数 open() 的完整语法格式为:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

python 文件处理 replace python 文件处理详解_python_02

 

file 是一个路径类对象 (path-like object),代表一个文件系统路径的对象。既可以是一个表示路径的 str 或 bytes 对象,也可以是一个实现了 os.PathLike 协议的对象 (支持 os.PathLike 协议的对象可通过调用 os.fspath() 函数转换为 str 或 bytes 类型的文件系统路径)。实际上,file 通常表示 将打开文件的路径 (绝对路径或当前工作目录的相对路径) 或 其他。

  mode 是一个可选 str,用于指定文件打开模式。mode 的默认值为 'r' (同 'rt'),表示默认以文本模式下的 只读 (read only) 方式打开文件 (且文件的指针将置于文件开头)。


三、打开方式

1、基础方式

python 文件处理 replace python 文件处理详解_python_03


 2、组合方式

python 文件处理 replace python 文件处理详解_应用程序_04

# 字符串——>编码(encode)——>二进制# 二进制——>解码(decode)——>字符串# 1、rb 模式
# rb =open('B_mode_file','rb')
# lookb = rb.read()
# print(lookb)           # 原生态二进制
# print(lookb.decode())  # decode解码

# 2、wb模式,需要指定编码

# wb = open('B_mode_file','wb')
# wb.write(bytes('欧阳锋',encoding="utf8"))
# wb.write('杨过'.encode())
# wb.close()

# 为啥要有这种方式呢?
# open默认方式 是rt、 wt 的方式,即:r、w ,也就是处理文本的方式。
# 1、文件类型不只有文本,也有图片,视频等,所以默认处理方式不能满足。
# 2、二进制可以跨平台使用,因为操作系统都是来使用硬件,硬盘接收的都是二进制。
# 3、b模式对linux没啥用,因为linux默认使用的就是b模式。


 3、文件修改过程

  文件的修改其实是覆盖覆盖,因为存到硬盘上的是二进制,使用软件打开文件就是把存在硬盘中的二进制,经过软件代码的识别转换,加载到内存中,并且以软件定义的规则,展现给我们。

在内存中,文件是可以修改的,使用软件保存后,软件会把修改后的文件,变成二进制,覆盖存入硬盘中。

1  src_f = open("模拟修改过程",'r',encoding="utf8") 2 # data = src_f.readlines() 3 # src_f.close()
 4 # 
 5 # dst_f = open("模拟修改过程之写","w",encoding="utf8")
 6 # dst_f.write(data[0]) #只写入第一行
 7 # dst_f.close()
 8 
 9 # 4、with as  用法:
10 
11 # with open("with的用法",'w',encoding='utf8') as file1:
12 #     file1.write('打开后自动关闭文件\n不用close。')
13 #
14 # 使用with打开两个文件,可使用 \ 将代码换行
15 # 需求:从源文件中读取文件内容并写到新文件中
16 with open("模拟修改过程",'r',encoding="utf8") as f1,\
17     open("模拟修改过程之写",'w',encoding="utf8") as f2:
18     data= f1.read()
19     f2.write(data)

模拟过程,与with用法


四、文件操作其他方法

# show_o_func = open('OtherFunction.txt','r+',encoding='utf8',newline='')# 以下例子都依赖↑该变量。测试时请解除注释。# 1、.tell()  #以数字为值返回光标所在位置,以字节为标准。
# data = show_o_func.readlines()
# print(data)    # 注意,这里读取出来的换行符(回车)是\r\n。是windows里的格式。
# print(show_o_func.tell()) # 查看光标当前所在位置

# 2、.flush() #内存里的数据刷到硬盘,例如,word自动保存
# show_o_func.flush()


# 3、.seek() #控制光标移动,以字节为单位
# show_o_func.seek(3)       #把光标移至第三个字节位
# print(show_o_func.tell()) #查看当前光标所在位置

# 4、.truncate()  # 截取文件内容
# 截取的本质 其实就是一种写模式,但是不能使用w w+,因为这两种会直接清空文件内容
# 然后再往文件里写内容,谈何截取。所以应该使用 r+  a+ 这两种模式。

# show_o_func.truncate(10)  #截取前10位
# print(show_o_func.read())


# .closed  # 判断文件是否为关闭状态。
# print(show_o_func.closed)

# show_o_func.close()
# print(show_o_func.closed)

# seek_more = open('seek_more.txt','rb')


 

五、seek的三种模式

1、seek的三种模式

  【0】模式:默认方式基于第‘0’个位置移动

  【1】模式:相对位置,从现在光标位置开始移动,必须是以‘b’模式使用

  【2】模式:倒叙;例:.seek(-4,2) 从后往前移动‘4’个字节位

示例4

# 1、 【 0 】模式:默认从位置 0 开始来移动光标# print(seek_more.tell())   # 光标初始位置# seek_more.seek(10)        # 移动光标到第10个字节# print(seek_more.tell())   # 查看当前个光标所在位置
# seek_more.seek(3)         # 移动光标到第三个字节
# print(seek_more.tell())   # 查看当前个光标所在位置

# 2、 【 1 】 模式:基于当前光标位置来移动光标(必须 为 b 模式)
# seek_more.seek(3,1)     # 使用 1 模式,从当前光标向后移动 3 个字节位
# print(seek_more.tell()) # 打印当前光标位置
# seek_more.seek(10,1)    # 使用 1 模式,从当前光标向后移动10 个字节位,当前光标位置为 3
# print(seek_more.tell()) # 打印当前光标位置。

# 3、 【 2 】 模式: 倒叙移动光标。第一个参数为负数,代表从后向前找
# 查看日志可以用到。
# seek_more.seek(-10,2)
# print(seek_more.readline().decode("utf8")) #读取从光标位置开始 到行尾结束。使用utf-8 解码


# seek_more.close()


 

2、个人笔记

字节(Byte):是计量单位 一字节等于八位        字符(Character):计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示'''
'''
# 注意:
#    read(3)代表读取3个【字符】,其余的文件内光标移动都是以【字节】位单位的
# 如:seek、tell、read、truncate
# 各个操作系统中,换行符的表达各有不同,python统一都会使用,\n做表示
# 如果需要,用文件中原始的方式读取,在打开文件的语句中加入,newline=''
# 如下:
# show_o_func = open('OtherFunction.txt','r',encoding='utf8',newline='')


 

 ————————————————

参考文献:

 

  https://docs.python.org/zh-cn/3.6/library/functions.html?highlight=open#open

  https://docs.python.org/zh-cn/3.6/glossary.html#term-file-object

  https://docs.python.org/zh-cn/3.6/glossary.html#term-path-like-object

  https://www.runoob.com/python3/python3-inputoutput.html

  https://www.runoob.com/python3/python3-file-methods.html