python对于文件的相关操作

1.文件对象

文件以文本内容或二进制的形式存储在计算机中。我们对文件内容文本内容或二进制内容进行读写操作。
关于python中对于文件的读写等,是通过创建文件对象来操作的。**open()**函数可以创建文件对象;
参数:open(file_path, mode=’’, encoding=‘utf-8’)
open函数的参数中常用的三个就是要读写的文件的路径file_path,文件的打开模式mode(详见下)和编码方式(一般指定为utf-8)。
返回:返回一个文件对象,基于该对象对文件进行各种操作。
注意:文件在操作完毕后必须执行close操作,将文件关闭.或者使用with关键字,他会自动启动上下文管理器的退出方法,即close()而无需我们手动操作。
简单示例:

f = open(r"D:\test\test.txt", 'r', encoding='utf-8')
res = f.read()
f.close()
print(res)
print('=========')
with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    res = f.read()
print(res)

输出结果:

这是我的测试文本哦!yeah
哈哈
=========
这是我的测试文本哦!yeah
哈哈

2.文件打开模式

模式特征
r以只读模式打开文件,此时文件的指针在文件的开头。
r+可读可写模式打开文件,文件指针在文件头部,从头写入会将原内容相应位置的内容清除直到写完内容
rb以二进制形式只读文件,一般用于图片,视频等的读取,文件指针在文件头部
rb+以二进制可读可写文件,一般用于图片,视频等的读取,文件指针在文件头部
w以只写模式打开文件,此时文件的指针在文件的开头。如果指定路径的文件已经存在则会将原有内容清空,文件指针指向头部开始写内容;若指定的路径文件不存在则会创建文件
w+可读可写模式打开文件,如果原文件存在则会清空内容,从文件头部开始写入;如果指定的路径文件不存在,则会创建新文件并写入内容
wb以二进制方式打开可写文件,如果原文件存在则会清空内容,从文件头部开始写入;如果指定的路径文件不存在,则会创建新文件并写入内容。
wb+以二进制方式可读可写文件内容,如果原文件存在则会清空内容,从文件头部开始写入;如果指定的路径文件不存在,则会创建新文件并写入内容。
a追加模式,打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后;如果指定路径的文件不存在,创建新文件进行写入。
a+打开一个文件用于读写,打开时文件指针位于文件尾部。在a+模式下读取时需要将指针移到需要读取的位置。
ab二进制模式追加,文件指针在文件末尾
ab+二进制模式可读可写追加,文件指针在文件末尾

以下为关于上面模式下经常会遇到的操作情况简单示例
1.在只读模式下写入会报错not writable

with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    f.write('gdshj')
# 在只读模式下,若写入内容则会报错
'''
Traceback (most recent call last):
  File "D:/MyClass/file_object.py", line 17, in <module>
    f.write('gdshj')
io.UnsupportedOperation: not writable
'''

2.在r+模式下,从头写入内容写入的内容占据原来内容对应字节数位置

with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    res = f.read()
print('before:',res)
with open(r"D:\test\test.txt", 'r+', encoding='utf-8') as f:
    f.write('ff')

with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    res = f.read()
print('after:',res)

输出结果:

before: -------------------------
after: ff-----------------------

实现图片的复制

with open(r"C:\Users\c-liucx02\Pictures\Saved Pictures\微信图片_20211208141751.jpg", 'rb') as f1, \
        open(r'C:\Users\c-liucx02\Pictures\Saved Pictures\3.jpg', 'wb') as f2:
    res = f1.read()
    f2.write(res)
with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    res = f.read()
print('原内容:',res)
with open(r"D:\test\test.txt", 'w', encoding='utf-8') as f:
    f.write('hello,我是新写入的内容')  #将原内容清空

with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    res = f.read()
print('内容:',res)

结果输出:

原内容: 旧内容
内容: hello,我是新写入的内容
with open(r"D:\test\test.txt", 'a', encoding='utf-8') as f:
    f.write('a+模式下追加的内容')  # 此时文件指针已经已到了文件末尾

with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    res = f.read()
print('内容', res)

输出结果:

内容 helloworlda+模式下追加的内容

3.文件对象的操作方法

关于文件对象的常用操作方法如下:
基本常用到的有wrte(), read()函数
(1)write()
用于写入内容,参数为要写入的字符串,write(str),同时内容中需要进行换行时使用’\n’
(2)read()
用于读取文件内容,当不加参数时,默认打开文件从起始位置读取文件全部内容文件指针会移动到文件尾部(当读取的文件内容较大时需要考虑内存压力);read(size)表示从开始位置读取指定数量的字节数。
读取以下文本内容:

我uuu
gdhsda
with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    res1 = f.read(3)
    res2 = f.read(5)
    res3 = f.read(5)
    res4 = f.read(5)

print(res1)
print('-----------')
print(res2)
print('-----------')
print(res3)
print('-----------')
print(res4)

输出结果:

我uu
-----------
u
gdh
-----------
sda
-----------

(3)readlines()
一次读取所有内容,并将每一行的内容按列表形式返回。

with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    # res1 = f.readline(2)
    res2 = f.readlines()
    for i in res2:
        print(i, end='')

(4)readline()
一次读取一行内容,然后将指针移动到下一行。每一行内容的末尾都有一个换行符/n;
当readline(limit)中参数limit不指定时默认返回一行的全部内容,指定limit时返回指定的字节数,指针移动到指定的字节数位置处,再执行readline则从此处读取一行。

with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    res1 = f.readline(2)
    res2 = f.readline()
    res3 = f.readline()
print(res1)
print(res2, end='')
print(res3, end='')
# 输出结果
'''
第一
行
第二行
'''
with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    while True:
        res2 = f.readline()
        if not res2:
            break
        print(res2, end='')

(3)seek()
设置指针的位置,seek(offset, from),offset表示指针偏移量,from表示开始移动的位置,其中0表示从文件头部位置,1表示从当前位置,2表示文件末尾位置。当文件以文本文件方式打开时,只能默认从文件头计算偏移量。即offset不为零时,from默认为0;若from不为0时,offset参数只能是0;
文本内容:

膈肌膈肌各级
第三行
第四行
第五行
第六行
with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    f.seek(3)   # 若指定起始指针位置为1,2则抛错:io.UnsupportedOperation: can't do nonzero cur-relative seeks
    res2 = f.tell()
    res1 = f.read(1)
print(res2)  # 3
print(res1)  # 肌

(4)tell()
获取文件指针当前的位置

with open(r"D:\test\test.txt", 'r', encoding='utf-8') as f:
    res1 = f.readline(2)
    res2 = f.tell()
print(res1)  # 第一
print(res2)  # 6

(5)truncate()
截取文件,截取的字节通过truncate(size)中size指定,默认为当前文件位置

(6)flush()
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入
(7)close()
关闭文件对象,从而无法对文件对象再操作。

示例:

在项目中很多情况下文件的操作与pickle(读写二进制文件),json(读写文本内容)结合在一起使用,详见pickle,json 章节的介绍https://blog.youkuaiyun.com/weixin_48561190/article/details/109407471

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值