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
无聊望见了犹豫 达到理想不太易
我有心底故事
谁人定我去或留 定我心中的宇宙
只想靠两手向理想挥手
终可见
posted @ 2017-07-31 22:46  Mr.hu  阅读(133)  评论(0)    收藏  举报