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")
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容