【Python基础】文件读写(5605字)

因上努力

个人主页:丷从心·

系列专栏:Python基础

学习指南:Python学习指南

果上随缘


打开文件

  • Python中,打开文件使用的是open()函数,open()函数的基本语法如下
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
open()函数参数解析
  • file:要打开的文件路径,可以是绝对路径也可以是相对路径
  • mode:打开文件的模式,默认为r,表示以只读模式打开文件
  • buffering:缓冲策略,是一个可选参数,默认值为None,表示使用系统默认的缓冲策略
    • 取值为 0 0 0False时,表示不进行缓冲,直接从磁盘读取或写入文件
    • 取值为 1 1 1True时,表示行缓冲,即每写入一行数据时,将其写入文件
    • 取值为大于 1 1 1的整数时,表示缓冲区的大小,以字节为单位,指定缓冲区大小可以提高文件的读取和写入效率
    • 取值小于 0 0 0时,使用系统默认的缓冲策略
  • encoding:文件编码,是一个可选参数,默认值为None,表示使用系统默认编码,常用编码包括'utf-8''gbk'
  • errors:编码错误处理方案,是一个可选参数,默认值为None,表示使用系统默认的错误处理方案,常用的取值包括'strict''ignore''replace'
  • newline:换行符处理,是一个可选参数,默认为None,表示使用系统默认的换行符处理方式,常用的取值包括'\n''\r\n'
  • closefd:关闭文件描述符,默认值为True,表示在关闭文件的同时关闭文件描述符
示例
  • 打开C:/Users/FOLLOW_MY_HEART/Desktop/Python Basics/【Python基础】文件读写/test.txt路径下的文件
file = open(r'C:\Users\FOLLOW_MY_HEART\Desktop\Python Basics\【Python基础】文件读写\test.txt')

file_name = file.name
print(file_name)
C:\Users\FOLLOW_MY_HEART\Desktop\Python Basics\【Python基础】文件读写\test.txt
  • open()函数返回一个File对象,表示计算机中的一个文件,读取文件时需要文件已经存在,否则会引发FileNotFoundError异常

文件路径

  • 文件路径是指文件在计算机上的位置,分为绝对路径和相对路径
绝对路径
  • 绝对路径是指从根文件夹开始的路径
  • Windows系统下,C盘、D盘等为根文件夹,在该盘符中的文件需要从根文件夹开始往下一级一级进行查找
  • 在类Unix系统下,/为根文件夹,所有文件的查找从/开始
示例
file = open(r'C:\Users\FOLLOW_MY_HEART\Desktop\Python Basics\【Python基础】文件读写\test.txt')

file_name = file.name
print(file_name)
C:\Users\FOLLOW_MY_HEART\Desktop\Python Basics\【Python基础】文件读写\test.txt
相对路径
  • 相对路径是指相对于程序当前工作目录的路径,比如存放当前程序的文件夹的绝对路径是C:\Users\FOLLOW_MY_HEART\Desktop\Python Basics\【Python基础】文件读写\,如果使用相对路径,就可以不写这个路径,用./代替这个路径值
示例
file = open('./test.txt')

file_name = file.name
print(file_name)
./test.txt

打开文件的模式

  • open()函数默认的打开文件的模式为r,表示以只读模式打开文件
常用模式
模式功能
r只读模式,默认模式
w只写模式,写入的内容会覆盖文件原有的内容,如果文件不存在会自动创建文件再进行写入
a追加模式,在文件末尾追加内容,如果文件不存在会自动创建文件再进行写入
+读写模式,与其他模式组合使用,如r+w+a+
x创建模式,如果文件已经存在会引发异常
t文本模式,默认模式
b二进制模式,用于访问二进制文件,与其他模式组合使用,如rbwbabrb+

读文件

  • open()函数返回的是一个File对象,使用File对象的read()方法可以读取文件内容,以字符串类型返回
read()函数语法
read(n=-1)
  • 参数n表示要读取的字符数,默认值为 − 1 -1 1,表示读取整个文件内容
    • 取值大于 0 0 0时,读取文件的前 n n n个字符
    • 取值等于 0 0 0时,不会读取任何字符,返回空字符串
    • 取值小于 0 0 0时,读取整个文件内容
示例
  • test.txt文件中提前写入Hello, world!,然后运行如下代码
file = open('./test.txt', 'r')

res = file.read()

print(res)
Hello, world!

写文件

  • File对象的write()方法可以向文件写入内容,返回写入文件的字符串的长度
示例
file = open('./test.txt', 'w')

len = file.write('Hello!')
print(len)

file = open('./test.txt', 'r')

res = file.read()
print(res)
6
Hello!
  • w模式写入的内容会覆盖文件原有的内容

  • 如果想要向文件中追加内容,则使用a模式

file = open('./test.txt', 'a')
file.write('\nHello!')

file = open('./test.txt', 'r')
res = file.read()

print(res)
Hello!
Hello!
  • 通过在追加的字符串中使用换行符\n,可以实现文件中内容的换行

按行读写文件

  • readline()readlines()writelines()方法用于按行读写文件
readline()方法
  • readline()方法默认情况下读取文件的一行内容,也可以指定在一行中读取的字符数
示例
file = open('./test.txt', 'w')
file.write('Hello, world!\nWelcome!')

file = open('./test.txt', 'r')

res_1 = file.readline()
res_2 = file.readline()
res_3 = file.readline()

print(f'res_1: {res_1}')
print(f'res_2: {res_2}')
print(f'res_3: {res_3}')
res_1: Hello, world!

res_2: Welcome!
res_3: 
  • 可以看到,readline()方法读取当前文件指针所在的一行中的内容,以换行符\n区分文件的每一行,如果readline()方法返回一个空字符串,说明已经读取到文件的末尾
readlines()方法
  • readlines()方法读取文件的每一行内容,返回一个列表,列表中的每个元素就是文件中的每一行内容
示例
file = open('./test.txt', 'w')
file.write('Hello, world!\nWelcome!')

file = open('./test.txt', 'r')
res = file.readlines()

print(res)
['Hello, world!\n', 'Welcome!']
writelines()方法
  • writelines()方法向文件写入每一行内容,传入一个列表,列表中的每个元素就是写入文件中的每一行内容
示例
file = open('./test.txt', 'w')
file.writelines(['Hello, world!\n', 'Welcome!'])

file = open('./test.txt', 'r')
res = file.read()

print(res)
Hello, world!
Welcome!

关闭文件

  • 一般情况下,一个文件对象在退出程序后会自动关闭,但是为了保证数据安全,还是要显示地写一个close()方法,用于关闭文件
示例
file = open('./test.txt')

file_name = file.name
print(file_name)

file.close()
./test.txt
finally语句
  • 当使用try语句发生异常时,即使使用了close()方法,也可能不能被执行
  • 可以将close()方法放在finally语句中,从而保证无论程序是否发生异常都会调用close()方法来关闭文件
示例
try:
    file = open('./test.txt', 'r')

    print(1 / 0)
finally:
    if file:
        print(file.name)

        file.close()
Traceback (most recent call last):
  File "C:/Users/FOLLOW_MY_HEART/Desktop/Python Basics/【Python基础】文件读写/test.py", line 1, in <module>
    print(1 / 0)
ZeroDivisionError: division by zero
./test.txt

上下文管理器

  • Python中的with语句可以帮助我们自动调用close()方法
示例
with open('./test.txt', 'r') as file:
    file_name = file.name
    print(file_name)
./test.txt
  • as关键字用于将文件对象赋值给变量file

  • with语句中的代码运行结束时,会自动调用close()方法


自定义读写类

示例
class OpenFile:
    def __init__(self, file_name):
        self.file_obj = file_name

    def __enter__(self):
        self.file_obj = open(self.file_obj, 'r', encoding='utf-8')

        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file_obj.close()

    def my_read(self):
        return self.file_obj.read()


with OpenFile('./test.txt') as file:
    res = file.my_read()
    print(res)
Hello, world!
Welcome!
  • 当被with语句调用时会自动触发__enter__()方法,用于打开文件
  • with语句中的代码运行结束时,会自动触发__exit__()方法,用于关闭文件
  • 自定义读写类展示了上下文管理器的底层实现

  • 37
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值