python文件处理

python内置了文件读写的函数,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据文件或者把数据写入这个文件对象

本章节的课程主要可以概括为以下几个方面:
1、文件对象
2、读写模式(以及各模式下文件对象不存在的默认处理方式)
3、文件指针
需要注意的是:
1、r 模式的指针默认是文件的结尾,w/a模式的指针默认的是文件的开头
2、指针方法返回的是字节数,write方法完成后返回的字符数
3、read方法的size参数指定的是字符数,不是字节数
4、seek方法指定的是也是字节数
4、utf-8编码,中文一个字符占用3个字节,gbk编码,一个中文字符占用2个字节
4、编码格式
5、文件操作方法
6、with...as

在Python中使用内置的open()函数来调用操作系统的接口实现文件的读写,函数中的参数用来确定我们具体要做的操作是读还是写,以及具体的读写模式

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

其中:
参数file:要操作的文件“路径+文件名”
参数mode:确定具体的读写模式(只读r,写入w,追加a等)
参数encoding:打开文件的编码方式

接下来我们会重点讲解mode这个参数
以下示例中的文件结构如下

--file_module
  --__init__.py
  --file_a.log
  --file_r.log
  --file_w.log
  --file_null.txt
  --file_topic.py

其中测试脚本文件位于file_topic.py文件中
文件读写示例

def read_file(file_path):
    """读取文件内容"""
    f = open(file=file_path, mode="r", encoding="utf-8")
    print(f.read())
    f.close()


read_file("./file_r.log")

字符编码问题
对于含有非ascii字符的文件,必须使用encoding,否则会抛异常UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 49: illegal multibyte sequence

#   f = open(file=file_path, mode="r", encoding="gbk")
def read_file(file_path):
     """读取文件内容"""
     f = open(file=file_path, mode="r")
     # f = open(file=file_path, mode="r", encoding="gbk")
     # f = open(file=file_path, mode="r", encoding="utf-8")
     print(f.read())
     f.close()

read_file("./file_r.log")

文件不存在的默认处理方式

def read_file(file_path):
     """读取文件内容"""
     f = open(file=file_path, mode="r", encoding="utf-8")
     # print(f.read())
     f.close()

read_file("./file_path.log")

文件不存在时:

  • r/r+ 报错:FileNotFoundError: [Errno 2] No such file or directory: './file_path.log'
  • w/w+ 存在则写入,不存在则直接创建新的文件并写入
  • a/a+ 存在则追加写入,不存在则创建新的文件并追加写入
r   以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb  以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+  打开一个文件用于读写。文件指针将会放在文件的开头。
w   打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb  以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+  打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a   打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+  打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

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

# def read_file(file_path):
#     """读取文件内容"""
#     # f = open(file=file_path, mode="rb", encoding="utf-8") # 二进制格式不需要指定encoding,否则会报错ValueError: binary mode doesn't take an encoding argument
#     f = open(file=file_path, mode="rb")
#     print(f.read())
#     f.close()
#
# read_file("./file_r.log")

** r+ 打开一个文件用于读写,文件指针将会放在文件开头**

# def read_file_r(file_path):
#     """读取文件内容"""
#     f = open(file=file_path, mode="r+", encoding="utf-8")
#     print(f.read())
#     print(f.tell())
#     f.seek(0)
#     print(f.tell())
#     print(f.write("test*****************########\n"))
#     print(f.tell())
#     f.close()
#
# read_file_r("./file_r.log")

read方法的size参数指定的是字符数,不是字节数

# def read_file_r(file_path):
#     """读取文件内容"""
#     f = open(file=file_path, mode="r", encoding="utf-8")
#     print(f.tell())
#     print(f.read(3))
#     print(f.tell())
#     f.seek(12)
#     print(f.read(3))
#     f.close()
#
# read_file_r("./file_null.txt")

w 打开一个文件只用于写入

# def read_file_r(file_path):
#     """读取文件内容"""
#     f = open(file=file_path, mode="w", encoding="utf-8")
#     # print(f.read()) # 在w模式下,只能写入,不能读取,此时使用read方法会报错:io.UnsupportedOperation: not readable
#     print(f.tell())
#     f.seek(0)
#     print(f.tell())
#     print(f.write("test*****************########\n"))
#     print(f.write("中文占用字节数\n"))
#
#     print(f.tell())
#     f.close()
#
# read_file_r("./file_w.log")

write() 方法用于向文件中写入指定字符串
在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。
示例如下:

# def read_file_w(file_path):
#     """读取文件内容"""
#     f = open(file=file_path, mode="w", encoding="utf-8")
#     print(f.write("test*****************########\n"))
#     print(f.write("中文占用字节数\n"))
#     sleep(5)
#     print(f.tell())
#     f.close()
#
# read_file_w("./file_null.txt")

文件对象操作方法:
file.read([size]): size 未指定则返回整个文件,如果文件大小 > 2倍内存则有问题,f.read()读到文件结尾时返回""(空字符串)
file.readline(): 返回一行
file.readlines([size]): 返回包含size行的列表,size未指定则返回全部行
for line in f: print(line): 通过迭代器访问
f.write("content\n"): 如果要写入字符串以外的数据,需先进行转换为字符串
f.tell(): 返回一个整数,表示当前文件指针的位置(就是到文件头的字节数)
f.seek(偏移量, [起始位置]): 用来移动文件指针
偏移量:单位为字节,可正可负
起始位置:0-文件头,默认值;1-当前位置;2-文件尾
f.close(): 关闭文件

with用法:
with是在python2.5版本后开始引入的一个新语法,他是一种上下文管理协议,目的在于从流程图中吧try...except和finally关键字和
资源分配释放相关代码统统去掉,简化try...except...finally的处理流程
with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭
线程中锁的获取和释放等

with语句的语法结构:

with expression [as target]:
    with_body

expression: 是一个需要执行的表达式
target: 是一个变量或者元组,存储的是expression表达式执行返回的结果,可选参数

# def read_file_w(file_path):
#     """读取文件内容"""
#     with open(file_path, mode='r') as f:
#         f.read()
#
#
# read_file_w("./file_with.txt")

你可能感兴趣的:(python文件处理)