文件的操作

打开文件三要素

路径、打开方式、编码格式。不标注打开方式默认为只读。

f1 = open('D:\a.txt', encoding='utf-8', mode='r')

f1 为文件句柄,也叫文件对象,所有的读写操作都是通过文件句柄完成的

文件操作的三要素

生成文件句柄

文件的读/写,文件写操作必须以写形式打开文件,文件读操作必须以读或读写操作打开文件

关闭文件句柄(若不关闭,则占用内存资源)

文件的读

read        #整个文件内容全部读取到内存中去,形成一个字符串

 f1 = open('D:\a.txt', encoding='utf-8', mode='r')
 content = f1.read()
 print(content)
 f1.close()

read(n)      #按照指定的字节数或字符数读取

log 文件中内容为:我爱你中国

当文件以r模式打开,n表示字符个数 f1
= open('log',encoding='utf-8',mode='r') content = f1.read(3) print(content,type(content)) 我爱你 <class 'str'>
f1.close()

当文件以rb 模式代开,n表示字节数
f1 = open('log',mode='rb')          #bytes 模式打开,不可以指定编码格式,是什么格式就以什么格式打开
content = f1.read(3)              #编辑器编码为utf-8,而中文的utf-8 编码为3个字节表示一个文字。
print(content,type(content))
c = content.decode(encoding='utf-8')
print(c)

  b'\xe6\x88\x91' <class 'bytes'>
  我

f1.close()

readline        #每次读取一行,按顺序读取,读取内容以字符串格式存在

log  文件内容
1 我爱你中国
2 alksdkjdsa
3 jldfj
4 k
5 ...


f1 = open('log',encoding='utf-8',mode='r')
content = f1.readline()
print(content)
print(f1.readline())
print(f1.readline())

 1 我爱你中国

  2 alksdkjdsa

  3 jldfj

f1.close()

readlines        #读取整个文件,把文件的每一行作为一个元素组成一个列表,不仅读取每一行内容还有换行符也一并读取。

f1 = open('log',encoding='utf-8',mode='r')
content = f1.readlines()
print(content)
['1 我爱你中国\n', '2 alksdkjdsa\n', '3 jldfj\n', '4 k\n', '5 ...']
f1.close()

for 循环读取文件    #可以迭代式的逐行读取,读取一行完毕后自动从内存中清除,再读取下一行。不耗费内存,适合读取大文件

f1 = open('log', encoding='utf-8')
for i in f1:
    print(i)
f1.close()

 whith open as ...   #无需关闭文件句柄

whith open('log',encoding='utf-8',mode='r') as f1:
    content = f1.read

r+          #文件的读写,可以读也可以写,但是不常用

文件指针操作

无论是文件的读还是写,读写操作后文件的指针都会停留在操作后的位置,例如readline 读取一行文件,指针就到了这一行的末尾,read读取全文,那么指针就到了文件最后。

seek(offset,whence)

  • offset -- 开始的偏移量,也就是代表需要移动偏移的字节数

  • whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

log 文件内容
abcdefg

f1 = open('log', encoding='utf-8', mode='r')
f1.seek(2,0)                    #以文件开头作为起始偏移量未二个字节
print(f1.read())
f1.close()

输出:
cdefg

seek(0)        #表示回到文件的开始

seek(0,2)          #表示回到文件的结尾

tell()     获取当前文件指针位置(字节)

log 内容 abcdefg f2 = open('log',encoding='utf-8') f2.read() print(f2.tell())                #英文字母一个字母对应一个字节 7 log1 内容 abcdefg文 f3 = open('log1',encoding='utf-8') f3.read() print(f3.tell())                #utf-8编码下中文字符占3个字节 10

 

文件的写

w       写模式        #覆盖写入,如果文件事先不存在则创建。文件打开的那一刻就已经清空了文件原有的内容,此处再用seek()已经无任何作用

w+    写读模式       #可以写也可以读。与w 特性完全一样,只是在写的基础上加入了读的模式。

a  追加写        #从文件的末尾处追加写入

log2内容
我是

f1 = open('log2', encoding='utf-8', mode='a')
f1.write('\n中国人')                  #加\n会换行,不加则会直接追加到后面
f1.close()

log2内容
我是
中国人

 

a+  

f1 = open('log2', encoding='utf-8', mode='a+')
f1.write('fdsafdsafdsagfdg')
f1.seek(0)                          #指针调整到文件开头,否则读取内容为空
print(f1.read())
f1.close()                        

 

应用示例

将文件中的所有kobe改为james

业务逻辑

1,打开原文件,产生文件句柄。
2,创建新文件,产生文件句柄。
3,读取原文件,进行修改,写入新文件。
4,将原文件删除。
5,新文件重命名原文件。

代码

import os
with open('file_test', encoding='utf-8') as f1,\
    open('file_test.bak', encoding='utf-8', mode='w') as f2:
    for line in f1:
        new_line = line.replace('kobe','james')
        f2.write(new_line)
os.remove('file_test')
os.rename('file_test.bak','file_test')

 

总结:

文件的操作模式有6种:r、r+、w、w+、a、a+,在上面模式基础上可以实现rb、r+b、wb、w+b、ab、a+b的bytes模式。

实际工作中常用的是r w a,读写同时进行容易出错谨慎使用。图片,视频等文件的操作使用b模式。

 

 

posted @ 2019-05-13 22:44  fanggege  阅读(175)  评论(0编辑  收藏  举报