Python之文件操作 一、文件操作基本流程 二、文件的编码(凡是带b的模式encoding可以省略不写) 三、文件的打开模式 四、文件的操作方法 五、文件的改

计算机系统分为:计算机硬件,操作系统,应用程序三部分。

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:

#变量:f1_obj,f1_file,file,file_handle... 文件句柄。
#open Python的内置函数,但是底层调用的windows系统的open功能,#open功能就是操作文件用的。
#windows系统默认的编码方式gbk,linux,macos:utf-8.
#流程: 1打开文件,产生文件句柄。
       2对文件句柄进行相应的操作。
       3,关闭文件。
Python代码
path 文件路径:d:护士空姐学生少妇联系方式.txt
encoding编码方式:utf-8,gbk....
mode 操作方式: 只读,只写,追加,读写,写读.....
路径:绝对路径:从根目录开始一直找到文件。
相对路径:从当前目录开始找到的文件。
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt',encoding='utf-8',mode= 'r') #默认打开模式就为r

#2. 通过句柄对文件进行操作
data=f.read()

#3. 关闭文件
f.close()

二、文件的编码(凡是带b的模式encoding可以省略不写)

f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。

#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f=open('a.txt',encoding='utf-8',mode ='r')

三、文件的打开模式

r、rb、r+、r+b;w、wb、w+、w+b;a、ab、a+、a+b模式(注意***代表必须熟练)

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

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

#3,‘+’模式(就是增加了一个功能)
r+, 读写【可读,可写】
w+,写读【可写,可读】
a+, 写读【可写,可读】

#4,以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】
文件打开模式
f1 = open('护士学生空姐班主任.txt', encoding='utf-8')
print(f1.read())
f1.close()

# 1,  f.read() 全部读出来。
# 2,  f.read(n)  n 是按照字符读取。
# 3,  f.readline() 按行读取
# 4,  f.readlines() 按行全部读取
# 5,  for 循环去读取。
f1 = open('护士学生空姐班主任.txt', encoding='utf-8')
for line in f1:
     print(line)
f1.close()
***r模式
#r+ 读写,先读后写

f1 = open('护士学生空姐班主任.txt', encoding='utf-8', mode='r+')
print(f1.read())
f1.write('666')
f1.close()
***r+模式
# rb模式 非文字类的文件


ps 非文字的文件的读取写入
f1 = open('11.jpg', mode='rb')
content = f1.read()
print(content)
f1.close()
f2 = open('小猪佩奇.jpg', mode='wb')
f2.write(content)
rb模式
#r+b 读写,先读后写   在b模式下


f1 = open('护士学生空姐班主任.txt', mode='r+b')
print(f1.read())
f1.write('666'.encode('utf-8'))
f1.close()
r+b模式
# w 模式 写模式
# w:没有文件,创建文件写内容。
# w:如果有文件,清空原文件,写入新内容。

f1 = open('log1', encoding='utf-8', mode='w')
f1.write('老男孩是最好的培训学校...')
f1.close()
***w模式
#wb    b模式下写



f1 = open('log2', mode='wb')
f1.write('法国进口分类结果'.encode('utf-8'))
f1.close()
wb模式
#w+ 先写后读


f1 = open('log1', encoding='utf-8', mode='w+')
f1.write('老老男孩.....')
f1.seek(0)  # 调整光标
print(f1.read())
f1.close()
w+模式
#w+b模式  b模式下先写后读


f1 = open('log1', mode='w+b')
f1.write('老老男孩.....'.encode('utf-8'))
f1.seek(0)  # 调整光标
print(f1.read())
f1.close()
w+b模式
# a:没有文件,创建文件写内容。
# a:有文件,直接在原文件的后面追加新内容。

f1 = open('log3', encoding='utf-8', mode='a')
f1.write('barry')
f1.close()
***a模式
# ab模式    b模式下追加


f1 = open('log3', mode='ab')
f1.write('barry'.encode('utf-8'))
f1.close()
ab模式
#a+模式  追加可读

f1 = open('log3', encoding='utf-8', mode='a+')
f1.write('范德萨急功近利开发工具')
f1.seek(0)
print(f1.read())
f1.close()
a+模式
# a+b模式   b模式下追加可读

f1 = open('log3', mode='a+b')
f1.write('范德萨急功近利开发工具'.encode('utf-8'))
f1.seek(0)
print(f1.read())
f1.close()
a+b模式

四、文件的操作方法

1.常用的操作方法

 *r
            read
            read(n)
            # r模式:read(n) n 是按照字符读取。
            # rb模式:read(n) n 是按照字节读取。
            readline()
            readlines()
            for循环 最好的    
# readable() 
# writeable()判断是否可读或者可写
f1 = open('log1', encoding='utf-8') print(f1.readable()) print(f1.writable()) f1 = open('log1', encoding='utf-8',mode='r+') print(f1.readable()) print(f1.writable())
# seek: 按照字节去调整光标
seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,
但无论哪种模式,都是以bytes为单位移动的

f1 = open('log1', encoding='utf-8')
f1.seek(3)
print(f1.read())
f1.close()
# tell 告诉光标的位置

f1 = open('log1', encoding='utf-8')
print(f1.tell())
print(f1.read())
print(f1.tell())
f1.close()
#truncate 对原文件进行截取内容,以字节形式,只能在a模式下使用。

f1 = open('log1', encoding='utf-8', mode='a')
f1.truncate(3)
f1.close()
#文件操作的另一种写法
with open (path,encoding=,mode=) as 文件句柄


with open('log1', encoding='utf-8') as f1,
    open('log2',encoding='utf-8', mode='w') as f2:
    print(f1.read())
    f2.write('666')

五、文件的改

步骤:

1,打开原文件 old_file,将原内容读取到内存。
2,创建一个新文件new_file。
3,将原内容通过你改写形成新内容,写入到新文件。
4,将原文件删除。
5,将新文件重命名成原文件。

例题:

有如下文件:

-------

alex是老男孩python发起人,创建人。

alex其实是人妖。

谁说alex是sb?

你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。

----------

将文件中所有的alex都替换成大写的SB。

#方法一,原文件内容不打,可以用此方法,但是此方法还是很low。


import os
with open('change', encoding='utf-8') as f1,
    open('change.bak', encoding='utf-8', mode='w') as f2:
    old_content = f1.read()
    new_content = old_content.replace('SB', 'alex')
    f2.write(new_content)
os.remove('change')
os.rename('change.bak', 'change')
# 方法2


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