(七)Python基础知识-文件读写

1、特性

Python读取文件主要使用open()这个函数,它会返回一个File对象,通过这个对象就可以实现文件对象的读写等操作。

2、读取文件关键函数open()

该函数包含多个参数:

一般常用的两个参数如下:

open(file, mode=‘r’)

参数说明:

  • file:文件路径(eg:D:\test.txt),必填;
  • mode:文件打开模式(eg:r,w等),选填。
完整的参数如下:

open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

  • file:必填,文件路径(相对或者绝对路径);
  • mode:选填,文件打开模式 ;
  • buffering:选填,设置缓冲 ;
  • encoding:选填,一般使用utf8 ;
  • errors:选填,报错级别 ;
  • newline:选填,区分换行符 ;
  • closefd:选填,传入的file参数类型 ;
  • opener:选填,可以通过传递可调用的打开器来使用自定义打开器。 然后,通过使用(file, flags)调用opener来获取文件对象的基础文件描述符。 开启程序必须返回一个打开的文件描述符(传递os.open,因为开启程序导致的功能类似于传递“无”)。
可用的mode如下:官方链接
模式描述直译
‘r’open for reading (default)以只读方式打开文件。文件的指针将会放在文件的开头。(默认模式)。
‘w’open for writing, truncating the file first打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
‘x’open for exclusive creation, failing if the file already exists写模式,新建一个文件,如果该文件已存在则会报错。
‘a’open for writing, appending to the end of the file if it exists打开一个文件进行写操作。如果该文件已存在,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
‘b’binary mode二进制模式
‘t’text mode (default)文本模式
‘+’open for updating (reading and writing)打开一个文件进行更新(可读可写)。

默认模式为 ‘r’ (打开用于读取文本,与 ‘rt’ 同义)。 模式 ‘w+’ 与 ‘w+b’ 将打开文件并清空内容。 模式 ‘r+’ 与 ‘r+b’ 将打开文件并不清空内容。

3、File对象常用的函数

序号函数名描述
1file.close()关闭文件。关闭后文件不能再进行读写操作。
2file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
3file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
4file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。
5file.read([size])从文件读取指定的字节数,如果未给定或为负则读取所有。
6file.readline([size])读取整行,包括 “\n” 字符。
7file.readlines([sizeint])读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
8file.seek(offset[, whence])移动文件读取指针到指定位置
9file.tell()返回文件当前位置。
10file.truncate([size])从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
11file.write(str)将字符串写入文件,返回的是写入的字符长度。
12file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

4、案例

准备一个具体的文件:D:\python_workplace\venv\test.txt,文件内容如下:

床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。

现有一个需求:为诗句添加标题和作者信息。

file2 = open("D:\\python_workplace\\venv\\test.txt", "r+", encoding='utf-8')
print("======读取文本原始内容:开始======")
# 读取所有行
list = file2.readlines()
for t in list:
    print(t)
print("======读取文本原始内容:结束======\r\n")

print("======基础函数调用:开始======")
print("文件指针初始位置:", file2.tell())
# 这个方法个人理解是文件有没有被其他设备占用
print("是否连接到终端设备:", file2.isatty())
# 读取第一行的前两个字符
line2 = file2.readline(2)
print("读取第一行指定数量的字符:", line2)
print("文件指针当前位置:", file2.tell())
# 执行文件截断 mode 需要设置可读写状态,因为会直接取操作文件中的字符
# file2.truncate(2)

print("======基础函数调用:结束======\r\n")

print("======执行写入内容:开始======")

"""
1、案例:为诗句添加标题和作者信息。
指针位置放到文件首,因为我们要在文件首的位置插入标题和作者信息 。
特别注意:mode用的是r+ (打开一个文件用于读写。文件指针将会放在文件的开头。原文本内容不会被清空,但是会覆盖写入位置的内容)
"""
# 指针放到文件首
file2.seek(0, 0)
print("文件指针当前位置:", file2.tell())
# 读取旧文本内容
old = file2.read()

# 指针放到文件首
file2.seek(0, 0)
print("文件指针当前位置:", file2.tell())
# 插入标题
file2.write("《静夜思》\n")
# 插入作者信息
file2.writelines(['作者', ':', "李白", '  _写于唐朝年间\r\n'])

# 回填旧文本内容
file2.write(old)

# 关闭缓冲
file2.flush()
# 关闭文件
file2.close()

print("======执行写入内容:结束======\r\n")

print("======读取最新内容:开始======")
file3 = open("D:\\python_workplace\\venv\\test.txt", "r+", encoding='utf-8')
# 读取所有行
list2 = file3.readlines()
for t in list2:
    print(t)

file3.flush()
file3.close()
print("======读取最新内容:结束======")

案例中夹杂了一些基础的函数操作,如读写操作等。

输出结果:
======读取文本原始内容:开始======
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
======读取文本原始内容:结束======
======基础函数调用:开始======
文件指针初始位置: 78
是否连接到终端设备: False
读取第一行指定数量的字符: 
文件指针当前位置: 78
======基础函数调用:结束======
======执行写入内容:开始======
文件指针当前位置: 0
文件指针当前位置: 0
======执行写入内容:结束======
======读取最新内容:开始======
《静夜思》
作者:李白  _写于唐朝年间
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
======读取最新内容:结束======

D:\python_workplace\venv\test.txt,文件内容已经改变,如下:

《静夜思》
作者:李白  _写于唐朝年间

床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。

5、总结:

open函数的模式有很多种,mode的取值可以进行一些特定的组合;
覆盖写入和非覆盖写入对应的mode都不同,实际使用要注意查看手册;
处理中文字符串文本时编码格式需要统一,一般使用"utf-8"进行 处理,不然会报错;
文件操作完成记得关闭。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值