Python 除了通过 print 函数将数据输出到控制台,也可以通过读 / 写文件的方式读取 / 输出到磁盘文件中,文件读写简称 I / O 操作。Python 文件 I / O 操作一共分为四部分:
- 打开(open)
- 读取(read)
- 写入(write)
- 关闭(close)
一.Python 文件的打开 open
在 Python 中打开文件使用函数 open,该函数返回文件句柄,具体使用方法如下:
file = open("文件名","打开文件模式") # 示例代码: # 打开d:/1.txt文件,如果d盘没有这个文件,会自动在d盘创建1.txt的空白文件,file是返回的文件句柄供读/写/关闭文件操作 file = open("d:/1.txt","wb")
其中,打开文件模式有以下几种类型:
二.Python 文件的关闭 close
文件在打开读写之后记得要有关闭操作,就好比蹲完坑得擦屁股,关闭文件使用 close 函数。
注意:文件关闭之后,不能在继续对文件读写操作,如果需要读写操作需要重新 open 打开文件。
close() # 关闭文件
三.Python 文件的读取 read
文件打开之后,可以通过返回的文件句柄读取文件中的内容,文件读取有以下几个函数:
1.read 函数
''' 参数: count - 表示需要读取的文字长度, conut 是缺省参数,如果没有设置 count 值,默认读取整个文件所有内容,该函数返回读取到的内容; 返回值:返回读取到的内容; 文件读取返回的内容并非字符串 str 类型,而是字节类型 bytes 类型,'b' 前缀代表的就是 bytes . ''' read( [count] )
2.readline 函数
//读取文件一行数据,返回读取的内容 readline()
3.readlines 函数
//读取文件的所有行内容,返回读取的所有内容,注意:返回的数据类型是列表,列表中每个数据都是文件中的一行数据 readlines()
**注意:文件读取返回的内容并非字符串 str 类型,而是字节类型 bytes 类型,’b’ 前缀代表的就是 bytes . **
如果想将 bytes 类型转为字符串直接使用 bytes.decode 方法即可,decode 方法默认使用 UTF-8 编码;假如 d:/1.txt 中的内容如下:
@Blog(个人博客地址): www.codersrc.com @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
文件读取的三种方式示例代码如下:
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:猿说编程 @Blog(个人博客地址): www.codersrc.com @File:Python 文件读写操作.py @Time:2021/04/17 10:00 @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """ # 方法一: print("方法一:使用 read() 函数读取txt内容") file_object = open("d:/1.txt","rb") contents = file_object.read() # 默认读取所有内容 # 读取文件内容,如果文件中含有中文需要decode()解码,否则中文无法显示 print(contents) print("---"*20) # 使用decode()解码中文,默认解码格式为utf-8 print("使用decode()函数解码中文:") print(contents.decode()) file_object.close() print("***"*20) # 方法二: print("方法二:使用 readline() 函数读取txt内容") file_object = open("d:/1.txt","rb") while True: contents = file_object.readline() print(contents.decode())# 使用decode()解码中文,默认解码格式为utf-8 if len(contents) == 0: # 读取内容长度为0,读取结束 break file_object.close() print("***"*20) # 方法三: print("方法三:使用 readlines() 函数读取txt内容") file_object = open("d:/1.txt","rb") # readlines() 返回列表,一行数据就是列表中的一个元素 contents = file_object.readlines() # 遍历列表 for content in contents: print(content.decode())# 使用decode()解码中文,默认解码格式为utf-8 file_object.close() ''' 输出结果: 方法一:使用 read() 函数读取txt内容 b'@Blog(\xe4\xb8\xaa\xe4\xba\xba\xe5\x8d\x9a\xe5\xae\xa2\xe5\x9c\xb0\xe5\x9d\x80): www.codersrc.com\r\n@WeChat Official Account(\xe5\xbe\xae\xe4\xbf\xa1\xe5\x85\xac\xe4\xbc\x97\xe5\x8f\xb7)\xef\xbc\x9a\xe7\x8c\xbf\xe8\xaf\xb4python\r\n@Motto:\xe4\xb8\x8d\xe7\xa7\xaf\xe8\xb7\xac\xe6\xad\xa5\xe6\x97\xa0\xe4\xbb\xa5\xe8\x87\xb3\xe5\x8d\x83\xe9\x87\x8c\xef\xbc\x8c\xe4\xb8\x8d\xe7\xa7\xaf\xe5\xb0\x8f\xe6\xb5\x81\xe6\x97\xa0\xe4\xbb\xa5\xe6\x88\x90\xe6\xb1\x9f\xe6\xb5\xb7\xef\xbc\x8c\xe7\xa8\x8b\xe5\xba\x8f\xe4\xba\xba\xe7\x94\x9f\xe7\x9a\x84\xe7\xb2\xbe\xe5\xbd\xa9\xe9\x9c\x80\xe8\xa6\x81\xe5\x9d\x9a\xe6\x8c\x81\xe4\xb8\x8d\xe6\x87\x88\xe5\x9c\xb0\xe7\xa7\xaf\xe7\xb4\xaf\xef\xbc\x81\r\n' ------------------------------------------------------------ 使用decode()函数解码中文: @Blog(个人博客地址): www.codersrc.com @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! ************************************************************ 方法二:使用 readline() 函数读取txt内容 @Blog(个人博客地址): www.codersrc.com @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! ************************************************************ 方法三:使用 readlines() 函数读取txt内容 @Blog(个人博客地址): www.codersrc.com @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! '''
四.Python 文件的写入 write
1.write 函数语法
文件写入可通过函数 write 完成,使用比较简单,先看看语法:
//直接传入 bytes 类型的字符即可,'b' 前缀代表的就是bytes. write( [bytes] )
2.write 函数使用案例
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:猿说编程 @Blog(个人博客地址): www.codersrc.com @File:Python 文件读写操作.py @Time:2021/04/17 10:00 @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """ file_object = open("d:/2.txt","wb") # '\n' 是文件I/O中的换行符,写完文件之后,自动换行 file_object.write(b"1234567\n") # 注意单引号和双引号的配合使用 file_object.write(b"file_object.write(b'sad')\n") file_object.write(b"python \n") file_object.close() ''' 代码执行完成后,d:/2.txt文件内容如下: 1234567 file_object.write(b'sad') python '''
注意:写入方式 ‘wb’ ,每次写入文件都会覆盖上一次的内容,即写入之前的内容会被清空;
五.Python 文件偏移 seek
有人看了上面 read 函数的示例代码可能会觉得频繁的打开和关闭文件会比较麻烦。那么仅仅打开和关闭文件一次,通过文件的偏移也能完成上述功能,文件的偏移使用** seek** 函数 。一般而言,seek 函数和 tell 函数都搭配使用;
1.seek 函数
''' 参数: offset - 表示相对whence 偏移多少个字节; whence - 表示偏移的位置,0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起; ''' seek([offset],[whence])
2.tell 函数
// 相对于文件开始位置,当前偏移的字节数 seek([offset],[whence])
小窍门:tell 函数也可以用来计算整个文件的 bytes 长度;
3.seek / tell 函数示例代码
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:猿说编程 @Blog(个人博客地址): www.codersrc.com @File:Python 文件读写操作.py @Time:2021/04/17 10:00 @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """ file_object = open("d:/2.txt","rb") # 获取当前的文件偏移,由于还没开始读取内容,偏移量等于 0 count = file_object.tell() print(count) # 读取文本所有数据内容,文件自动偏移到文件末尾 contents = file_object.read() # 获取整个文件的偏移量 ,实际上就是文件内容的大小 count = file_object.tell() print(count) # 将文件指针偏移到文件开始位置 file_object.seek(0,0) # 读取一行数据,按道理讲应该是获取第一行数据 contents = file_object.readline() print(contents.decode()) # 获取当前偏移量 count = file_object.tell() print(count) # 继续读取一行数据 contents = file_object.readline() print(contents.decode()) # 获取当前偏移量 count = file_object.tell() print(count) file_object.close() ''' 输出内容: 0 474 python教程 - 猿说python : 第一行数据 www.codersrc.com 68 python教程 - 猿说python : 第二行数据 www.codersrc.com 136 '''
注意:一般只要调用 read / readline / readlines / write 等函数,文件指针会自动发生偏移。
六.重点总结
- 1.read 函数可以设置读取指定的长度,例如:只读取 10 个字符 read(10);
- 2.readlines 返回值是列表 list,并非 bytes 类型,而列表中的每一个元素都是文件中的一行数据,类型是 bytes 类型;
- 3.如果文件读取的内容含有中文,需要通过函数 decode 方法解码转为字符串,decode 方法默认为 UTF-8 解码;
- 4.文件 open 之后记得 close ,养成良好的书写习惯;