Python基础之文件操作

一.文件路径

绝对路径

绝对路径指的是从盘符开始的,直接到达目标文件位置的目录下的绝对位置。 绝对路径完整的描述了文件位置。例如,在 D 盘下的 code 文件夹中有一个 test.py 文件,那么路径就是 D:/code/test.py

相对路径

相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。例如,在 D 盘 work 文件下有一个 test.txt 文件,那么它相对上文的 test.py 文件的路径就是 /work/test.txt


二.文件操作

操作流程

# 1. 打开文件,得到一个文件句柄并赋值给一个变量
f = open('Hape.txt', mode='r', encoding='utf-8')  # 默认打开模式为只读模式r

# 2. 通过文件句柄对文件进行操作,对于文件的操作有很多种,read只是其中一种
content = f.read()  # f.read([size])  从文件中读取指定的字节数,若未给定或为负数则读取所有

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

注意: 打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕该文件时,必须将这两部分资源全部回收。回收操作有:

f.close()  # 回收操作系统级打开的文件
del f  # 回收应用程序级的变量

其中del f必须放在f.close后面,否则就会导致操作系统级的文件无法关闭,浪费内存资源。而 Python 的自动的垃圾回收机制让我们不用再考虑del f的操作。但是必须要关闭文件f.close

为了避免漏写f.close的情况,我们可以借助with关键字。with不仅有更优雅的语法,还可以很好地处理上下文环境产生的异常。

with open('Hape.txt', mode='r', encoding='utf-8') as f:
    pass

同时处理两个文件

# 将文件a中的内容写入文件b中
with open('a.txt', 'r') as fa, open('b.txt', 'w') as fb:
    content = fa.read()
    fb.write(content)

文件编码

f = open(…) 是由操作系统打开文件,那么如果我们没有为 open 指定编码,那么操作系统就会用自己的默认编码去打开文件。在 Windows 下是 gbk, Linux 下是 utf-8。 若要保证不乱码,文件用什么方式存储的,就用什么方式打开


文件的打开模式

  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, 写读【可写,可读】


文件操作方法

常用操作
f.read(size)
# 从文件指针处开始读取指定的 字节/字符 数,如果未给定或为负则读取所有。
f.read(3)  
# 文件打开为文本模式时,读取三个字符
# 文件打开为bytes模式时,读取三个字节
f.write()

用于向文件中写入指定字符串。

在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。

如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not ‘str’。

with open('a.txt', 'r+b') as f:
    content = f.read()
    f.write("人生苦短".encode('utf-8'))
f.seek(offset, whence)

用于移动文件读取指针到指定位置。
offset 代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
whence 默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。其中 1 和 2 必须在bytes模式下进行。
注意: 无论 whence 选择什么值,指针都是以 bytes 为单位移动的。

f.tell()

返回文件指针当前的位置

f.readline(size)

从文件中读取整行,包括行末的'\n'。若指定了一个非负参数,则返回指定大小的 字符/字节 数。

'''文件中的内容:
人生苦短
我用python
富强文明民主和谐美丽
'''
with open('a.txt', 'r+', encoding='utf-8') as f:
    line1 = f.readline()
    line2 = f.readline(3)
    line3 = f.readline(2)
    line4 = f.readline()
    print(line1, line2, line3, line4, sep='*')
'''输出结果:
人生苦短
*我用p*yt*hon

'''
f.readlines()

读取文件的所有行,并返回一个列表。

'''文件中的内容:
人生苦短
我用python
富强文明民主和谐美丽
'''
with open('a.txt', 'r+', encoding='utf-8') as f:
    content_list = f.readlines()
    print(content_list)

'''输出结果:
['人生苦短\n', '我用python\n', '富强文明民主和谐美丽']
'''
f.truncate(size)

从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。


文件的修改

文件的数据全部都是储存在硬盘上的。因此只能覆盖,不能修改。我们常常看到的修改文件,都是模拟出来的。
具体的操作办法是:将硬盘中存放的文件内容加载到内存中,在内存中修改内容,然后赋值到新的文件中,再由新文件覆盖原文件。

示例:将文件的 “PHP” 全部替换成 “Python”

方式一: 将文件内容一次性全部读入内存。如果文件很大,会很卡

import os  # 调用系统模块

with open('a.txt', 'r') as read_f, open('a.txt.swap', 'w') as write_f:
    content = read_f.read()
    content = content.replace('PHP', 'Python')
    write_f.write(content)

os.remove('a.txt')  # 删除原文件
os.replace('a.txt.swap', 'a.txt')  # 将新文件重命名为原文件

方式二: 将文件逐行读入内存修改。 这种方式有效避免文件过大而操作的卡顿问题。

import os  # 调用系统模块

with open('a.txt', 'r') as read_f, open('a.txt.swap', 'w') as write_f:
    for line in read_f:
        line = line.replace("PHP", "Python")
        write_f.write(line)

os.remove('a.txt')  # 删除原文件
os.replace('a.txt.swap', 'a.txt')  # 将新文件重命名为原文件
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值