文件操作


什么是文件?

文件就是数据持久化存储在磁盘上的一种形式,常见的文件如音频(mp3)、视频(mp4)、网页(html)、Python文件(py)、图片(png)、图片(jpg)、文本(txt)等等。

想一想,我们在电脑上面一般是如何操作文件的呢?

第一步:打开文件

第二步:编辑保存文件

第三步:关闭文件

用 Python 来操作文件流程大致与上列步骤一致。

打开文件

在 Python 中使用 open 函数打开文件,具体操作如下:

    open(参数1,参数2)
        open函数就是在本地打开一个文件
        参数1 选择文件的路径
        参数2 打开文件的方式
file = open('文件路径','文件的打开模式')

# 示例 :打开c盘下面的1.txt文件用于写入数据
file = open('c:/1.txt','w')

# 写入权限
file.write("我是世界上最美丽的人!")

# 关闭文件
file.close()

open 函数返回的结果可以用于对改文件进行后续的操作,比如写入数据,关闭文件等等。

文件的打开模式有以下类型:

    关于文件路径
        相对路径: 以当前操作的文件为起点,去寻找文件
            ./ 上一级目录
            ../ 上上一级目录
        
         绝对路径: 以计算机盘符为起点

总结个规律:

  • 带 r 的都需要操作文件必须存在;

  • 带 b 的是用二进制方式处理;

  • 带 + 号的都有读写权限;

  • r 是read 只读,文件必须在;

  • w 是white 只写,文件在就原文件重写,没有就新建;

  • a 是追加写内容,抓住重点随意组合;

     随意组合中
         1 凡是含有r这个文件都必须存在,如果不存在程序报错
         2 凡是含有w,如果文件存在就覆盖原来的内容,文件不存在就创建新文件
    
      文件操作的注意事项:
          非纯文本都是用二进制的方式处理操作
          json txt csv
    

写入数据

文件写入使用

write 函数

# 使用相对路径打开文件,并赋予追加写入权限
file = open('file/1.txt','w+')

# 在文件1.txt中写入数据
file.wirte('亲爱的同志们,我爱你们!')

writelines函数

new_file = open("file/2.txt","w")

# 一次写一行
new_file.writelines("啦啦啦\n啦咔咔咔")

关闭文件

当结束文件操作后,需要执行关闭文件操作,以释放资源,使用 close( ) 函数,文件关闭后将不能继续对文件进行读写操作,如果需要读写操作,则需要重新打开文件。

# 使用相对路径打开文件,并赋予追加写入权限
file = open('file/1.txt','w+')

# 在文件1.txt中写入数据
file.wirte('亲爱的同志们,我爱你们!')

# 关闭文件,结束文件操作
file.close()

文件读取

存储单位
比特位 
字节 0000 0000  8个比特位 --> 255  计算机底层二进制 99999999 11111111(二进制)
KB 1024个字节
MB 1024kb
GB
TB
PB

read函数

语法结构:

'''
file.read(参数) 用于读取文件

参数:count为缺省参数,不传为读取整个文件,若传递则为需要读取的长度,一次性读取文件的大小

返回值:读取到的内容
'''
read(count)

代码示例:

# 假设存在文件1.txt
file = open('1.txt','r')
# 读取整个文件
content = file.read()
# 读取文件 按照字节读完为止
content = file.read(1024)
# 关闭文件
file.close()

readline函数

'''
读取文件的一行数据
返回值:读取到的内容
'''
readline()

readlines函数

'''
读取文件所有行的内容
返回值:读取到的内容,返回的数据类型是列表,每一行数据都是列表中的一个元素
'''
readlines()

案例练习:文件复制

"""
文件说明:用Python实现文件复制

    1 打开源文件,权限为读 r
    2 开始读取源文件内容
    3 创建新文件
    4 将读取到的内容写入新文件
    5 关闭新老文件

"""

# 获取老文件名称
old_file_name = input("请输入你想要复制的文件名称:")

# 打开文件
old_file = open(old_file_name,"r")

# 开始读取文件
content = old_file.read()

# 找到文件后缀名.的下标
index = old_file_name.rfind(".")
# 字符串切片方式提取数据
new_file_name = old_file_name[:index] + "[副本]" + old_file_name[index:]

# 创建新文件,写入权限
new_file = open(new_file_name,"w")

# 写入数据
new_file.write(content)

# 关闭新老文件
new_file.close()
old_file.close()

with open as

? 通过上面的案例我们发现,每次打开一个文件结束操作的时候,必须要将这个文件关闭,相对来说比较繁琐,有时候还很容易忘记,我们可以使用with open as,这样操作文件的时候就可以不用手动关闭文件,程序在结束文件操作后会自动关闭文件。

"""

    with open as 方法不需要手动关闭文件,当你的with open as这个语句块结束以后,
    程序自动帮你关闭

    flush 方法 : 刷新缓存

"""

with open("file/1.txt","r") as new_file:
    content = new_file.read()
    # 强制刷新缓存,保障数据全部写出,一般情况下,文件关闭后程序会自动刷新到磁盘中.
    # 使用flush方法,在文件关闭之前,确保数据写出了.
    new_file.flush()
    print(content)

文件偏移(文件的定位读取)

seek 函数

'''
参数2表示从文件的哪个位置开始算,0表示从文件开头,1表示从当前位置,2表示从文件末尾
参数1表示从参数2的位置开始,往后偏移多少个字节
'''
seek(参数1,参数2)
参数1:偏移量
参数2:方向
0 从文件开头处理
1 表示从当前游标位置开始
2 表示从文件末尾开始

tell函数

'''
获取当前文件中的偏移量,可以记录游标的位置
可以使用tell获取文件总的bytes长度
'''
tell()

结合运用

# 打开文件
file = open("file/test.txt","r")
# 读取文件 读取一个字节
file.read(1)
file.seek(2,0) # 从开头开始算,偏移两个字节
num = file.tell() # 记录游标,返回游标的位置
file.seek(num,1) # 从游标的位置开始读取文件

file.close()