7_文件操作

文件操作

文件操作的内容流程

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

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

一、文件操作

1、语法

​ f = open(文件,mode="模式", encoding="编码")
模式:
​ r:只读
​ w:只写
​ a:追加写
​ +:扩展
​ b:字节(非文本文件)

open()

​ 内置函数,open底层调用操作系统的接口
f :变量,也称为文件句柄;对文件进行的任何操作
encoding :可以不写,默认编码本:操作系统的默认的编码
​ windows:gbk
​ linux、mac:utf-8

2、文件操作三部曲

​ a、打开文件
​ b、对文件句柄进行操作
​ c、关闭文件句柄

3、读取文件最好的方案 with:

​ (还可以打开多个文件,之间用逗号隔开)

​ with open() as f:
​ for line in f:
​ line = line.strip()

二、open()方法详解

1、用法

​ open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
​ 注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

2、open()函数

open()函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode='r')
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
file: 必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型

3、mode 参数

模式 描述
t 文本模式 (默认)。
b 二进制模式。

​ +:打开一个文件进行更新(可读可写)。

​ r 以只读方式打开文件。文件的指针将会放在文件的开头。(默认模式)
​ rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
​ r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
​ rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。

​ w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
​ wb 以二进制格式打开一个文件只用于写入。如果文件已存在则打开文件,并从开头开始编辑(原有内容会被删除)。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
​ w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
​ wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。

​ a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
​ ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
​ a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
​ ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

​ x 写模式,新建一个文件,如果该文件已存在则会报错。默认为文本模式,如果要以二进制模式打开,加上 b 。

4、file 对象常用的函数

​ 函数 方法及描述
​ file.read([size]) 从文件读取指定的字符数,未给定或为负则读取所有。
​ file.readline([size]) 读取整行,包括 "\n" 字符。
​ file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。

​ file.write(str) 写入文件,返回写入的字符长度。
​ file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

​ file.close() 关闭文件。关闭后文件不能再进行读写操作。
​ file.tell() 返回文件当前位置。以字节(中文:3字节,英文:1字节)为单位。
​ file.seek(offset[, whence]) 移动文件读取指针到指定位置,0代表起始位置,1代表当前位置,2代表末尾(字节单位)。
​ file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件(保存文件), 而不是被动的等待输出缓冲区写入。

三、文件改操作

1、步骤:

​ a、以读的模式打开原文件
​ b、以写的模式创建一个新文件
​ c、将原文件的内容读出来修改成新内容,写入新文件
​ d、将原文件删除
​ e、将新文件重命名成原文件名

2、实例

实例一

简版(一次性读取和写入),针对小文件,遇到大文件是内存读取不了
import os
# 文件的改操作
# 第一、二步,以只读方式打开原文件,以写方式打开新文件。
with open('aa/hello.txt', encoding='utf-8') as f1,open('aa/hello.bak', encoding='utf-8', mode='w') as f2:
	# 第三步,修改内容,写入新文件。
    old_content = f1.read()
    new_content = old_content.replace('hello', '你好')
    f2.write(new_content)
# 第四步,将原文件删除。
os.remove('aa/hello.txt')
# 第五步,将新文件重命名为原文件名
os.renames('aa/hello.bak', 'aa/hello.txt')

实例二

# 进阶版(逐行读取和写入,每次一行,减少了内存的开销)
import os
# 文件的改操作
# 第一、二步,以只读方式打开原文件,以写方式打开新文件。
with open('aa/hello.txt', encoding='utf-8') as f1,\
        open('aa/hello.bak', encoding='utf-8', mode='w') as f2:
    # 第三步,修改内容,写入新文件。
    for line in f1:
		old_line = line.strip()
        new_line = old_line.replace('hello', '你好')
        f2.write(new_line)
# 第四步,将原文件删除。
os.remove('aa/hello.txt')
# 第五步,将新文件重命名为原文件名
os.renames('aa/hello.bak', 'aa/hello.txt')
# 注意:write清空问题;只有关闭文件再打开写入时才会清空,一次操作时没有关闭文件时
可以反复写入。

四、os简单操作

os.path() 模块os.path 模块主要用于获取文件的属性。

以下是 os.path 模块的几种常用方法:
方法 说明
os.path.abspath(path) 返回绝对路径
os.path.basename(path) 返回文件名
os.path.dirname(path) 返回文件路径
os.path.exists(path) 路径存在则返回True,路径损坏返回False
os.path.join(path1[, path2[, ...]]) 把目录和文件名合成一个路径
os.path.getsize(path) 返回文件大小,如果文件不存在就返回错误
os.path.isfile(path) 判断路径是否为文件
os.path.isdir(path) 判断路径是否为目录
os.path.isabs(path) 判断是否为绝对路径
os.path.split(path) 把路径分割成 dirname 和 basename,返回一个元组
os.path.splitdrive(path) 一般用在 windows 下,返回驱动器名和路径组成的元组
os.path.splitext(path) 分割路径,返回路径名和文件扩展名的元组
os.path.splitunc(path) 把路径分割为加载点与文件
os.path.lexists 路径存在则返回True,路径损坏也返回True
os.path.getatime(path) 返回最近访问时间(浮点型秒数)
os.path.getmtime(path) 返回最近文件修改时间
os.path.getctime(path) 返回文件 path 创建时间

五、OS 文件/目录常用方法

os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:

序号 方法及描述
os.chdir(path) 改变当前工作目录
os.getcwd() 返回当前工作目录
os.listdir(path) 返回path指定的文件夹包含的文件或文件夹的名字的列表。
os.remove(path) 删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。
os.removedirs(path) 递归删除目录。
os.rename(src, dst) 重命名文件或目录,从 src 到 dst
os.renames(old, new) 递归地对目录进行更名,也可以对文件进行更名。
os.rmdir(path) 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。
os.path 模块 获取文件的属性信息。
os.mkdir(path[, mode]) 以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。
os.open(file, flags[, mode]) 打开一个文件,并且设置需要的打开选项,mode参数是可选的
os.read(fd, n) 从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。
os.write(fd, str) 写入字符串到文件描述符 fd中. 返回实际写入的字符串长度
os.close(fd) 关闭文件描述符 fd
os.chmod(path, mode) 更改权限

posted @ 2020-07-20 11:43  小金a  阅读(142)  评论(0编辑  收藏  举报