day3-文件操作
概述
在工作中,我们通常会对文件进行操作,下面我们来介绍如何使用Python操作文件,文件操作流程:
1.打开文件,得到文件句柄并赋值给一个变量
2.通过句柄对文件进行操作
3.关闭文件
基本语法
open(文件路径,模式,字符编码)
用法:函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写
file = open("open_file","r",encoding="utf-8")  #获取文件句柄
data = f.read()  #读取数据
print(data)   #打印读取的文件
f.close()   #关闭文件
注: file又叫文件句柄,它包含文件的文件名、文件的字符集、文件的大小、文件在硬盘上的起始位置
不同模式打开文件的完全列表:
data = open("open_file",'r+',encoding="utf-8") #读写
data = open("open_file",'w+',encoding="utf-8") #写读
data = open("open_file",'a+',encoding="utf-8") #追加读写
data = open("open_file",'rb') #读 二进制文件(python 3.0 网络传输只能传输二进制编码的文件,不是纯的二进制文件)
file对象方法
buzaiyouyu文件内容:
无聊望见了犹豫 达到理想不太易 即使有信心 斗志却抑止 谁人定我去或留 定我心中的宇宙 只想靠两手向理想挥手 终可见
1.read([size])
用法:size未指定则返回整个文件,如果文件大小>2倍内存则有问题.f.read()读到文件尾时返回""(空字串)
f1 = open("buzaiyouyu","r",encoding="utf-8")
print(f1.read())  #读取文件全部
f1.close()
#输出
无聊望见了犹豫 达到理想不太易 
即使有信心 斗志却抑止 
谁人定我去或留 定我心中的宇宙 
只想靠两手向理想挥手 
终可见
2.readline()
用法:可以每次读取一行内容
f1 = open("buzaiyouyu","r",encoding="utf-8")
print(f1.readline())  #读取一行
f1.close()
#输出
无聊望见了犹豫 达到理想不太易
3.readlines()
用法:一次读取所有内容并按行返回一个列表
f1 = open("buzaiyouyu","r",encoding="utf-8")
print(f1.readlines())  #读取文件中的每一行,并把每行作为一个元素形成一个列表
f1.close()
#输出
["无聊望见了犹豫 达到理想不太易\n","即使有信心 斗志却抑止\n","谁人定我去或留 定我心中的宇宙\n","只想靠两手向理想挥手\n","终可见"]
再通过for循环读取每行:
f1 = open("buzaiyouyu","r",encoding="utf-8")
for index,line in enumerate(f1.readlines()):
      if index == 3:
          print("---------第4行-------")
          continue
     print(line.strip())
#输出
无聊望见了犹豫 达到理想不太易
即使有信心 斗志却抑止
谁人定我去或留 定我心中的宇宙
---------第4行-------
终可见
对于小文件我们可以使用read()方法进行文件的读取,但是,我们知道在互联网公司,日志记录可能一天就能达到10G以上,使用read()方法就会显得力不从心,因为全部一次读入内存,内存就爆了,在这里,我们可以通过read(size),readline(),readlines(),因此,要根据需要决定怎么调用。
4.for line in f: print line
用法:通过迭代器访问
f1 = open("buzaiyouyu","r",encoding="utf-8")
count = 0
for line in f1:
     if count == 9:
        print("======================")
        count += 1
        continue
     print(line)
     count += 1
     print(count)
#输出
无聊望见了犹豫 达到理想不太易
1
即使有信心 斗志却抑止
2
======================
只想靠两手向理想挥手
4
终可见
5
优点:就是它不要求你事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。迭代的元素,仅仅可以在需要迭代的时候使用,特别适合用于对读大文件,所以省内存。
5.write(string)
用法:如果要写入字符串以外的数据,先将他转换为字符串.
# 打开文件
f = open("buzaiyouyu", "r+")
print ("文件名: ", f.name)
str = "OH… 纵有创伤不退避"
# 在文件末尾写入一行
fo.seek(0, 2)
line = f.write(str)
# 关闭文件
fo.close()
#输出到文件buzaiyouy.txt
无聊望见了犹豫 达到理想不太易
即使有信心 斗志却抑止
谁人定我去或留 定我心中的宇宙
只想靠两手向理想挥手
终可见OH… 纵有创伤不退避
6.tell()
用法:返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).
#打开文件
f = open("buzaiyouyu", "r+")
print ("文件名为: ", f.name)
line = f.readline()
print ("读取的数据为: %s" % (line))
# 获取句柄当前文件指针位置
position = f.tell()
print ("当前位置: %d" % (position))  #按字符计数
# 关闭文件
f.close()
#输出
文件名为:  buzaiyouyu
读取的数据为: 无聊望见了犹豫 达到理想不太易
当前位置: 44
7.seek(偏移量,[起始位置])
用法:用来移动文件指针
偏移量:开始的偏移量,也就是代表需要移动偏移的字节数,单位:比特,可正可负
起始位置:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
# 打开文件
f = open("buzaiyouyu", "r+")
print ("文件名为: ", f.name)
line = f.readline()
print ("读取的数据为: %s" % (line))
f.seek(0, 0)    #移动指针位置
line = f.readline()
print ("读取的数据为: %s" % (line))
# 关闭文件
f.close()
#输出
文件名为:  buzaiyouyu
读取的数据为: 无聊望见了犹豫 达到理想不太易
读取的数据为: 无聊望见了犹豫 达到理想不太易
8.close()
用法:方法用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发 ValueError 错误。 close() 方法允许调用多次。当 file 对象,被引用到操作另外一个文件时,Python 会自动关闭之前的 file 对象。 使用 close() 方法关闭文件是一个好的习惯。
9.flush()
用法:方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
# 打开文件
f1 = open("buzaiyouyu", "wb")
print ("文件名为: ", f1.name)
f1.write("hello world".encode())  #转换为bytes类型,否则报错
# 刷新缓冲区
f1.flush()  #强制刷新(存到硬盘上)
# 关闭文件
f1.close()
#输出
文件名为:  buzaiyouyu
#输出到文件buzaiyouyu.txt
hello world
10.fileno()
用法:方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
# 打开文件
f1 = open("buzaiyouyu", "wb")
print ("文件名为: ", f1.name)
fid = f1.fileno()
print ("文件描述符为: ", fid)
# 关闭文件
f1.close()
#输出
文件名为:  buzaiyouyu
文件描述符为:  3
11.truncate()
用法:用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
f1 = open("buzaiyouyu", "r+")
print ("文件名: ", f1.name)
line = f1.readline()
print ("读取行: %s" % (line))
f1.truncate()
line = f1.readlines()
print ("读取行: %s" % (line))
# 关闭文件
f1.close()
#输出
文件名:  buzaiyouyu
读取行: 无聊望见了犹豫 达到理想不太易
读取行: ['即使有信心 斗志却抑止\n', '谁人定我去或留 定我心中的宇宙\n', '只想靠两手向理想挥手\n', '终可见']
12.encoding
用法:获取文件编码类型
data = open("buzaiyouyu", "r+",encoding="utf-8")
print(data.encoding)  #文件的编码类型
#输出‘
utf-8
13.seekable()
用法:判断文件指针是否可移,可以返回True
f = open("buzaiyouyu",'r',encoding="utf-8")
print(f.seekable())
f.close()
#输出
True
14.readable()
用法:判断文件是否可读,可读返回True
f = open("buzaiyouyu",'r',encoding="utf-8")
print(f.readable())
f.close()
#输出
True
15.isatty()
用法:方法检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False。
f = open("buzaiyouyu",'r',encoding="utf-8")
print(f.isatty())
f.close()
#输出
False #表示不是一个终端设备
16.name
用法:返回文件名
f1 = open("buzaiyouyu‘", "wb")
print ("文件名为: ", f1.name)
#输出
buzaiyouyu
17.encode()
用法:将str类型转换为bytes
详细请猛击这里
print('€20'.encode()) #默认转为bytes类型(二进制)
print('€20'.encode(“utf-8”))
#输出
b'\xe2\x82\xac20'
b'\xe2\x82\xac20'
data = open("open_file",'rb')  #读 二进制文件(python 3.0 网络传输只能传输二进制)
data.write("hello world\n".encode())       #将字符(系统默认)encode成二进制再写入
with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open(’log‘,'r') as f:
用此种方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
with支持同时对多个文件的上下文进行管理,即:
with open('log1’) as obj1,open('log2') as obj2:
      pass
文件修改
边读边写
f=open("open_file","r",encoding="utf-8")  #读取老文件
f_new=open("open_file.bak","w",encoding="utf-8")   #写入新文件
for line in f:   #一边读新文件,修改内容
     if "即使有信心 斗志却抑止"in line:  
         line=line.replace("即使有信心 斗志却抑止","我有心底故事")
       
     f_new.write(line)   #写入文件
f.close()
f_new.close()
#输出到文件open_file.txt
无聊望见了犹豫 达到理想不太易
即使有信心 斗志却抑止
谁人定我去或留 定我心中的宇宙
只想靠两手向理想挥手
终可见
#输出到文件open_file.bak.txt
无聊望见了犹豫 达到理想不太易
我有心底故事
谁人定我去或留 定我心中的宇宙
只想靠两手向理想挥手
终可见

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号