当前位置: 首页 > news >正文

【Python 基础学习笔记】文件的基础操作

目录

  • 1. 创建
  • 2. 写入
  • 3. 关闭
  • 4. 读取
  • 5. 定位
  • 6. 其他方法

1. 创建

Python 使用 open() 函数创建或打开文件,语法格式如下所示:

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

参数说明如下所示:

  • file:表示将要打开的文件的路径,也可以是要被封装的整数类型文件描述符。(如果是文件描述符,它会随着返回的 I/O 对象关闭而关闭,除非 closefd 被设为 False 。)
  • mode:是一个可选字符串,用于指定打开文件的模式,默认值是 ‘r’(以文本模式打开并读取,同 ‘rt’)。对于二进制写入, ‘w+b’
    模式打开并把文件截断成 0 字节; ‘r+b’ 则不会截断。可选模式如下:
模式	描述
r		读取(默认)
w		写入,并先截断文件
x		排它性创建,如果文件已存在则失败
a		写入,如果文件存在则在末尾追加
b		二进制模式
t		文本模式(默认)+ 	更新磁盘文件(读取并写入)
  • buffering:是一个可选的整数,用于设置缓冲策略。传递0以切换缓冲关闭(仅允许在二进制模式下),1选择行缓冲(仅在文本模式下可用),并且>1的整数以指示固定大小的块缓冲区的大小(以字节为单位)。如果没有给出 buffering 参数,则默认缓冲策略的工作方式如下:
二进制文件以固定大小的块进行缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”或使用 io.DEFAULT_BUFFER_SIZE。在许多系统上,缓冲区的长度通常为40968192字节。“交互式”文本文件( isatty() 返回 True 的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。
  • encoding:用于解码或编码文件的编码的名称。
  • errors:是一个可选的字符串,用于指定如何处理编码和解码错误(这应该只在文本模式下使用。不能在二进制模式下使用)。
  • newline:区分换行符,它可以是 None,‘’,‘\n’,‘\r’ 和 ‘\r\n’。它的工作原理:
从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以 '\n''\r''\r\n' 结尾,这些行被翻译成 '\n' 在返回呼叫者之前。如果它是 '',则启用通用换行模式,但行结尾将返回给调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者。将输出写入流时,如果 newline 为 None,则写入的任何 '\n' 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 '''\n',则不进行翻译。如果 newline 是任何其他合法值,则写入的任何 '\n' 字符将被转换为给定的字符串。
  • closefd:如果 closefd 为 False
    并且给出了文件描述符而不是文件名,那么当文件关闭时,底层文件描述符将保持打开状态;如果给出文件名,closefd 为 True(默认值),否则将引发错误。标准名称包括:
如果存在编码错误,'strict' 会引发 ValueError 异常。 默认值 None 具有相同的效果。'ignore' 忽略错误。请注意,忽略编码错误可能会导致数据丢失。'replace' 会将替换标记(例如 '?' )插入有错误数据的地方。'surrogateescape' 将表示任何不正确的字节作为Unicode专用区中的代码点,范围从U+DC80到U+DCFF。当在写入数据时使用 surrogateescape 错误处理程序时,这些私有代码点将被转回到相同的字节中。这对于处理未知编码的文件很有用。只有在写入文件时才支持 'xmlcharrefreplace'。编码不支持的字符将替换为相应的XML字符引用 &#nnn;。'backslashreplace' 用Python的反向转义序列替换格式错误的数据。'namereplace' (也只在编写时支持)用 \N{...} 转义序列替换不支持的字符。
  • opener:可以通过传递可调用的 opener 来使用自定义开启器。 以 txt 格式文件为例,我们不手动创建文件,通过代码方式来创建,如下所示:
open('test.txt', mode='w',encoding='utf-8')

执行完上述代码,就为我们创建好了 test.txt 文件。

2. 写入

上面我们创建的文件 test.txt 没有任何内容,我们向这个文件中写入一些信息,对于写操作,Python 文件对象提供了两个函数,如下所示:

函数				描述
write(str)			将字符串写入文件,返回写入字符长度
writelines(s)		向文件写入一个字符串列表

我们使用这两个函数向文件中写入一些信息,如下所示:

wf = open('test.txt', 'w', encoding='utf-8')
wf.write('Tom\n')
wf.writelines(['Hello\n', 'Python'])
# 关闭
wf.close()

3. 关闭

上面我们使用了 close() 函数进行关闭操作,如果打开的文件忘记了关闭,可能会对程序造成一些隐患,为了避免这个问题的出现,可以使用 with as 语句,通过这种方式,程序执行完成后会自动关闭已经打开的文件。
with 语句是一种上下文管理器,当它的代码块执行完毕时,会自动关闭文件。这是推荐的方式,因为它确保文件在使用完毕后被正确关闭,即使发生异常也能保证关闭。如下所示:

with open('test.txt', 'w', encoding='utf-8') as wf:wf.write('Tom\n')wf.writelines(['Hello\n', 'Python'])

4. 读取

之前我们已经向文件中写入了一些内容,现在我们读取一下,对于文件的读操作,Python 文件对象提供了三个函数,如下所示:

函数			描述
read(size)		读取指定的字节数,参数可选,无参或参数为负时读取所有
readline()		读取一行
readlines()		读取所有行并返回列表

我们使用上面三个函数读取一下之前写入的内容,如下所示:

with open('test.txt', 'r', encoding='utf-8') as rf:print('readline-->', rf.readline())print('read-->', rf.read(6))print('readlines-->', rf.readlines())

5. 定位

Python 提供了两个与文件对象位置相关的函数,如下所示:

函数							描述
tell()							返回文件对象在文件中的当前位置
file.seek(offset[, whence])		将文件对象移动到指定的位置;offset 表示移动的偏移量;whence 为可选参数,值为 0 表示从文件开头起算(默认值)、值为 1 表示使用当前文件位置、值为 2 表示使用文件末尾作为参考点

下面通过示例对上述函数作进一步了解,如下所示:

with open('test.txt', 'rb+') as f:f.write(b'123456789')# 文件对象位置print(f.tell())# 移动到文件的第四个字节f.seek(3)# 读取一个字节,文件对象向后移动一位print(f.read(1))print(f.tell())# 移动到倒数第二个字节f.seek(-2, 2)print(f.tell())print(f.read(1))

6. 其他方法

with open('test.txt', 'r+') as f:# 检测文件对象是否连接到终端设备print(f.isatty())# 截取两个字节f.truncate(2)print(f.read())

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • cmake查看 编译信息里面的详细的gcc/g++的编译参数
  • 在Gin框架中实现Token令牌认证
  • CSS的盒子模型(Box Model)
  • 2024百度的组织架构和产品分布
  • SegFormer网络结构的学习和重构
  • LCR 029
  • [Web安全 网络安全]-CSRF跨站请求伪造
  • 面试经典 150 题:力扣88. 合并两个有序数组
  • 普通本科生也能成为AI高手:人工智能学习指南
  • 嵌入式 开发技巧和经验分享
  • 桌面专业版【修改主机名和更改计算机显示名称】方法介绍
  • Go语言Mutex的优化与TryLock机制解析
  • 微信小程序-使用vant组件库
  • 音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件
  • 9/24作业
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • co.js - 让异步代码同步化
  •  D - 粉碎叛乱F - 其他起义
  • git 常用命令
  • Hibernate最全面试题
  • js继承的实现方法
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • node-glob通配符
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • SpingCloudBus整合RabbitMQ
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • TypeScript迭代器
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 从tcpdump抓包看TCP/IP协议
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何在GitHub上创建个人博客
  • 网页视频流m3u8/ts视频下载
  • 新版博客前端前瞻
  • 主流的CSS水平和垂直居中技术大全
  • 组复制官方翻译九、Group Replication Technical Details
  • ![CDATA[ ]] 是什么东东
  • # centos7下FFmpeg环境部署记录
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #大学#套接字
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (3) cmake编译多个cpp文件
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (三)Honghu Cloud云架构一定时调度平台
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (转)重识new
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET Standard 的管理策略
  • .net Stream篇(六)
  • .NET/C# 的字符串暂存池
  • .NET委托:一个关于C#的睡前故事
  • .net专家(高海东的专栏)
  • .sh
  • @AutoConfigurationPackage的使用