大鹏

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

文件操作

本章节内容如下:

    1、文件的打开模式
    2、文件对象的方法
    3、文件的关闭
    4、文件的定位和读取
      4.1、文件的定位
      4.2、文件的读取
        read()
        readline()    读取一整行
        readlines()  读取所有行
        使用list(f)来读取
    5、文件的写入
    6、一个任务
    7、作业
    8、扩展阅读

 

 

1、文件的打开模式

 

open()

help(open)  可以查看到open()的帮助文档
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

#open()函数有很多参数,初学者只关注第一和第二个参数。
#第一个参数是传入的文件名,不带文件路径则表示打开当前路径下的文件
#第二个参数是指定的文件打开模式

 

open函数详解:

1. open()语法

open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
open函数有很多的参数,常用的是file,mode和encoding
file文件位置,需要加引号
mode文件打开模式,见下面3
buffering的可取值有0,1,>1三个,0代表buffer关闭(只适用于二进制模式),1代表line buffer(只适用于文本模式),>1表示初始化的buffer大小;
encoding表示的是返回的数据采用何种编码,一般采用utf8或者gbk;
errors的取值一般有strict,ignore,当取strict的时候,字符编码出现问题的时候,会报错,当取ignore的时候,编码出现问题,程序会忽略而过,继续执行下面的程序。
newline可以取的值有None, \n, \r, ”, ‘\r\n',用于区分换行符,但是这个参数只对文本模式有效;
closefd的取值,是与传入的文件参数有关,默认情况下为True,传入的file参数为文件的文件名,取值为False的时候,file只能是文件描述符,什么是文件描述符,就是一个非负整数,在Unix内核的系统中,打开一个文件,便会返回一个文件描述符。

2. Python中file()与open()区别
两者都能够打开文件,对文件进行操作,也具有相似的用法和参数,但是,这两种文件打开方式有本质的区别,file为文件类,用file()来打开文件,相当于这是在构造文件类,而用open()打开文件,是用python的内建函数来操作,建议使用open
open函数详解

 

打开文件

#打开文件,获得文件句柄
f = open("record.txt")  #默认以文本模式打开,只读模式

f = open("record.txt",'r')

 

文件操作的基本流程

文件操作其实可以分成三大部分:
        1.打开文件,获取文件句柄并赋予一个变量
        2.通过句柄对文件进行读与写的操作
        3.操纵完毕后,关闭文件

下面是一个具体的示例程序:
1.操作完成后自动关闭文件的
 with open(‘db’,'r')as f:
    data = f.read() #一次性将文件中的内容读从磁盘上加载到内存里面
    data = f.readline() #每次只读取一行数据
    data = f,write() #对文件进行写入的操作

2.需要手动关闭文件的
 f = open('db','r')
 f.read() #对文件进行读取的操作
 f.close() #关闭文件

 

文件打开模式总结

#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】

#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb 
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

#3. 了解部分
"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
a+, 写读【可读,可写】


x, 只写模式【不可读;不存在则创建,存在则报错】
x+ ,写读【可读,可写】
xb

 

 

 

2、文件对象的方法

 

 

#掌握
f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中

f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

#了解
f.readable() #文件是否可读
f.writable() #文件是否可读
f.closed #文件是否关闭
f.encoding #如果文件打开模式为b,则没有该属性
f.flush() #立刻将文件内容从内存刷到硬盘
f.name

 读取文件的每一行

 1 f =open('C:\\Users\\acer\\Desktop\\ok.txt','r')
 2 #指针先移动到文件的起始位置
 3 print(f.seek(0,0))
 4 #打印出每一行,推荐使用
 5 for each_line in  f:
 6     print(each_line)
 7 
 8 #这个方法也一,但一般不推荐
 9 line= list(f)
10 for each_line in line:
11     print(each_line)
View Code

 

 

 3、文件的关闭

对文件进行操作后,数据都缓存在内存里,需要关闭文件后,才能保存到文件
#打开文件,获得文件句柄
f = open("record.txt")  #默认以文本模式打开,只读模式

f = open("record.txt",'r')

#对文件进行操作后,数据都缓存在内存里,需要关闭文件后,才能保存到文件
#关闭文件
f.close()

 

4、文件的定位和读取

4.1、文件的定位

文件内光标移动都是以字节为单位如seek,tell,truncate,所有必须在b模式下进行。(踩过的坑)
#文件指针,就是一个“书签”,起到文件定位的作用
#seek(offser,from) 方法有两个参数,表示从from 偏移 offset字节
# from 有三个参数 :0 代表文件的起始位置,1代表当前位置,2代表文件末尾,其中1和2必须在b模式下进行


f = open("record.txt",'rb')

print(f.seek(0,0))      #将文件指针设置到文件的起始位置
print(f.seek(0,1))      #将文件指针设置到当前位置
print(f.seek(0,2))      #将文件指针设置到文件末尾
print(f.tell())         #查看当前文件的指针位置

注意:
  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

 

4.2、文件的读取

read()

#打开文件,获得文件句柄
f = open("record.txt",'r',encoding='utf-8')

print(f.read())        #读取所有

""" 
read(3):  
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
"""

print(f.read(3))           # 5分钟   读取了三个字节
#打开文件,获得文件句柄
f = open("record.txt",'rb')

print(f.read())        #读取所有

""" 
read(3):  
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
"""

print(f.read(3))           # 5分钟   读取了三个字节
View Code

 

readline()    读取一整行

用于在文件中读取一整行,就是从文件指针的位置向后读取,直到遇到换行符(\n)结束。

#打开文件,获得文件句柄
f = open("record.txt",'r',encoding='utf-8')
print(f.readline(2))       #读取第一行的前2个字节
print(f.readline())      #读取一整行,直到遇到换行符(\n)结束

#关闭文件
f.close()

 

readlines()  读取所有行

#打开文件,获得文件句柄
f = open("record.txt",'r',encoding='utf-8')
b =f.readlines()    #读取所有行
for i in b:
    print(i)

#关闭文件
f.close()

 

使用list(f)来读取

#打开文件,获得文件句柄
f = open("record.txt",'r',encoding='utf-8')
file = list(f)
#print(file)
for each_line in file:
    print(each_line)

#关闭文件
f.close()

 

 5、文件的写入

文件的写入,需要确保打开的模式有"w"或者"a",否则会出错

"w" 模式写入文件,此前的文件内容会被全部删除

"a"模式写入文件,表示追加(修改文件建议用"a"模式

#追加模式
f = open("record.txt",'a',encoding='utf-8')
f.write("这是一段待写入的数据")
f.close()

#再次打开
f = open("record.txt",'r',encoding='utf-8')
print(f.read())   #可以查看到追加到末尾
f.close()

 

#覆盖模式
f = open("record.txt",'w',encoding='utf-8')
f.write("这是一段待写入的数据")
f.close()

#再次打开
f = open("record.txt",'r',encoding='utf-8')
print(f.read())   #可以查看只有写入的这一行数据
f.close()

 

 

6、一个任务

 

任务:将文件(record.txt)中的数据进行分割并按照以下规律保存起来:
小甲鱼的对话单独保存为boy_*.txt的文件(去掉“小甲鱼:”)
小客服的对话单独保存为girl_*.txt的文件(去掉“小客服:”)
文件中总共有三段对话,分别保存为boy_1.txt, girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt共6个文件(提示:文件中不同的对话间已经使用“==========”分割)

 

record.txt 文件

小客服:小甲鱼,今天有客户问你有没有女朋友?
小甲鱼:咦??
小客服:我跟她说你有女朋友了!
小甲鱼:。。。。。。
小客服:她让你分手后考虑下她!然后我说:"您要买个优盘,我就帮您留意下~"
小甲鱼:然后呢?
小客服:她买了两个,说发一个货就好~
小甲鱼:呃。。。。。。你真牛!
小客服:那是,谁让我是鱼C最可爱小客服嘛~
小甲鱼:下次有人想调戏你我不阻止~
小客服:滚!!!
================================================================================
小客服:小甲鱼,有个好评很好笑哈。
小甲鱼:哦?
小客服:"有了小甲鱼,以后妈妈再也不用担心我的学习了~"
小甲鱼:哈哈哈,我看到丫,我还发微博了呢~
小客服:嗯嗯,我看了你的微博丫~
小甲鱼:哟西~
小客服:那个有条回复“左手拿著小甲魚,右手拿著打火機,哪裡不會點哪裡,so easy ^_^”
小甲鱼:T_T
================================================================================
小客服:小甲鱼,今天一个会员想找你
小甲鱼:哦?什么事?
小客服:他说你一个学生月薪已经超过12k了!!
小甲鱼:哪里的?
小客服:上海的
小甲鱼:那正常,哪家公司?
小客服:他没说呀。
小甲鱼:哦
小客服:老大,为什么我工资那么低啊??是时候涨涨工资了!!
小甲鱼:啊,你说什么?我在外边呢,这里好吵吖。。。。。。
小客服:滚!!!
View Code

 

参考答案

 

 

7、作业

[课后作业] 第028讲:文件:因为懂你,所以永恒 | 课后测试题

[课后作业] 第029讲:文件:一个任务 | 课后测试题

 

 

8、扩展阅读

 [扩展阅读] 文件的打开模式和文件对象方法

【python开发之路】文件操作  (原文

Python 基础之文件 函数

Alex之文件操作

武沛齐之文件操作

元先生之文件操作

王松的文件操作

 

posted on 2018-12-16 10:27  pf42280  阅读(395)  评论(0)    收藏  举报