Python文件操作

简介

引子

现在这个世界上,如果可以操作文件的所有软件都消失了,比如word,wps等等,此时你的朋友通过qq给你发过来一个文件,文件名是:美女模特空姐护士联系方式.txt,在座的所有男同学,那么你接受到这个文件之后,你的内心是否有一丝冲动,当然咱们不是那种闷骚的人,其实我们就是比较好奇,就是想要看看里面写的是什么,仅此而已,绝不联系。但是我说了所有可以操作文件的软件全部都没了,那么你是不是百爪挠心,火急火燎,哎呀。别急呀,你忘了么?你学过Python这门编程语言,这个语言肯定有能操控文件的功能。我相信在这种强大的动力下,你是可以,必须能学会的。

  • 编码方式

    utf-8,gbk,gb2312....  (昨天刚讲完编码,文件其实就是数据的存储,数据存储你需要编码知道这个数据是以什么编码存储的)

  • 操作模式

    只读,只写,追加,写读,读写....

1 文件的读

  • read()
    读取全部
file = open('D:内容.txt',encoding='utf-8',mode='r')

print(file.read())

file.close()

'''
open内置函数,open底层调用的是操作系统接口。
f1,变量 f1 fh file f_h 文件句柄
'''

  • read(n)
    指定字符个数进行读

file = open('D:内容.txt',encoding='utf-8',mode='r')

print(file.read())

file.close(1)
>>>
详
  • readline()
    按行读
file = open('D:内容.txt',encoding='utf-8',mode='r')

print(file.readline()

file.close(1)

  • readlines()

readlines() 返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩盘。


f = open('log',encoding='utf-8')
print(f.readlines())
f.close()
# 结果['666666
', 'fkja l;
', 'fdkslfaj
', 'dfsflj
', 'df;asdlf
', '
', ]
  • for 循环读取

可以通过for循环去读取,文件句柄是一个迭代器,他的特点就是每次循环只在内存中占一行的数据,非常节省内存。


f = open('../path1/弟子规',mode='r',encoding='utf-8')
for line in f:
    print(line)      #这种方式就是在一行一行的进行读取,它就执行了下边的功能

print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
  • rb读取图片(bytes)

 rb模式:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。记住下面讲的也是一样,带b的都是以二进制的格式操作文件,他们主要是操作非文字文件:图片,音频,视频等,并且如果你要是带有b的模式操作文件,那么不用声明编码方式。

file = open('D:美女.jpg',mode='rb')

img = file.read()

file.close()

f1 = open('美女.jpg',mode='wb')

f1.write(img)

f1.close()
>>> 
会创建一个名字为美女.jpg图片

2 文件的写

  • wb模式

wb模式:以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如:图片,音频,视频等。

file = open('D:美女.jpg',mode='rb')

img = file.read()

file.close()

f1 = open('美女.jpg',mode='wb')

f1.write(img)

f1.close()
>>> 
会创建一个名字为美女.jpg图片
  • w模式

如果文件不存在,利用w模式操作文件,那么它会先创建文件,然后写入内容.

f1 = open('文件.txt',encoding='utf-8',mode='w')     #没有会在当前目录下创建一个这样文件,有责覆盖里的内容

print(f1.write("Hello python"))

f1.close()
  • a追加模式

打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入

如果文件不存在,利用a模式操作文件,那么它会先创建文件,然后写入内容。

f1 = open('文件.txt',encoding='utf-8',mode='a')     

print(f1.write("
Hello python"))

f1.close()

  • r+读写模式
    打开一个文件用于读写。文件指针默认将会放在文件的开头。

 如果你在读写模式下,先写后读,那么文件就会出问题,因为默认光标是在文件的最开始,你要是先写,则写入的内容会讲原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。

f1 = open('文件.txt',encoding='utf-8',mode='r+')

print(f1.read())
print(f1.write("
Hello python"))

f1.close()
 

3 文件的另一种打开方式


# 1,利用with上下文管理这种方式,它会自动关闭文件句柄。
with open('t1',encoding='utf-8') as f1:
    f1.read()
    
# 2,一个with 语句可以操作多个文件,产生多个文件句柄。
with open('t1',encoding='utf-8') as f1,
        open('Test', encoding='utf-8', mode = 'w') as f2:
    f1.read()
    f2.write('老男孩老男孩')
    

4 文件的修改

将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)


import os  # 调用系统模块
with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    data=read_f.read() #全部读入内存,如果文件很大,会很卡
    data=data.replace('alex','SB') #在内存中完成修改
    write_f.write(data) #一次性写入新文件
os.remove('a.txt')  #删除原文件
os.rename('.a.txt.swap','a.txt')   #将新建的文件重命名为原文件

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件


import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    for line in read_f:
        line=line.replace('alex','SB')
        write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 
原文地址:https://www.cnblogs.com/precipitation/p/15097464.html