python文件IO基础知识

目录

1.open函数打开文件

2.文件对象读写数据和关闭

3.文本文件和二进制文件的区别

4.编码和解码

读写文本文件时

读写二进制文件时

5.文件指针位置

6.文件缓存区与flush()方法


1.open函数打开文件

使用 open 函数创建一个文件对象,read 方法来读取数据,write 方法来写数据
语法:fileObject = open(filename, mode)
filename文件路径
mode取值:
  • "r":为了读打开一个文件
  • "w":为了写打开一个文件,如果文件已经存在则覆盖
  • "a":为了写打开一个文件,从文件末尾追加写入
  • "rb":为读取二进制数据打开文件
  • "wb":为写入二进制数据打开文件
  • "ab":追加写入二进制数据
file1 = open("scores.txt", "r")# 在 filename 前加上 r 表示将反斜线\看做普通的字符,使其没有其他功能
file2 = open(r"c:\pybook\scores.txt", "r")  # 如果没有 r 前缀,使用转义序列
file3 = open("c:\\pybook\\scores.txt", "r")  

2.文件对象读写数据和关闭

open函数创建了一个文件对象,这是_io.TextIOWrapper类的一个实例。这个类包含了读写数据和文件关闭的方法。

特别说明:

  • readline()是读取当前行中还未读取的内容,返回字符串。这个行指以换行符\n 结尾之前的内容
  • readlines()是读取剩下所有未读取的内容,返回列表,列表的每一个元素时每行未读取的字符串
  • print 函数会自动插入换行符\n,而 write 方法需要显式地添加一个换行符号\n 用来换行写数据
  • close方法必须被调用,特别是写文件时,忘记close可能导致文件内容无法写入
def main():outfile = open("Presidents.txt", "w")outfile.write("QingHui\t")outfile.write("ZhangSan\n")outfile.write("XiaoWang\t")outfile.write("DaBing\n")outfile.write("Others")outfile.close()file2 = open("Presidents.txt", "r")string1 = file2.read(10)print(string1)  # QingHui	Zhstring3 = file2.readline()print(string3)  # angSanstring4 = file2.readlines()  # ['XiaoWang\tDaBing\n', 'Others']print(string4)file2.close()main()

按行读取文件全部数据

# 法一
infile = open("Presidents.txt", "r")
all_data = []
line = infile.readline()
while line != '':all_data.append(line)line = infile.readline()
print(all_data)# 法二
infile = open("Presidents.txt", "r")
all_data = []
for line in infile:all_data.append(line)
print(all_data)"""
['QingHui\tZhangSan\n', 'XiaoWang\tDaBing\n', 'Others\n', '\n', '\n']
['QingHui\tZhangSan\n', 'XiaoWang\tDaBing\n', 'Others\n', '\n', '\n']
"""

简洁读写文件

with open(参数) as file, 自动关闭文件
filepath = r"D:\test\1.txt"with open(filepath, "r") as file:for line in file:print(line, end="")print()with open(filepath, "rb") as file:for line in file:line = line.decode("gbk", "ignore")print(line, end="")print()
读写数值数据
由于文本文件中的数据都是字符串类型,所以在进行数值数据的读写的时候都要进行相应的数据类型转换。为了正确地读出文件中的数字,利用” ”或者\n 的空白符来分隔数字。复杂一点的需要使用正则表达式。
from random import randintdef main():outfile = open("Numbers.txt", "w")for i in range(100):outfile.write(str(randint(0, 9)) + " ")outfile.close()infile = open("Numbers.txt", "r")s = infile.read()numbers = [eval(x) for x in s.split()]for number in numbers:print(number, end = " ")infile.close()main()

3.文本文件和二进制文件的区别

【c基础】文件操作-CSDN博客

参考这篇文章中《2.文本文件与二进制文件的区别》

4.编码和解码

读写文本文件时

  • 编码就是将文本模式变成二进制模式。在向一个文本文件写入指定内容时,会将文本内容按指定编码类型编码为二进制,然后放在文件中。
  • 解码就是二进制模式变为文本模式。在从一个文本文件读取内容时,会将读取到的二进制内容按指定编码类型解码为字符串
打开文件时,如果不指定编码方式,则默认utf-8,不过也可以使用encoding参数指定编码方式。
注意写入文件时用什么编码方式,读取时也最好用什么编码方式,这样保证内容能正确读取到,否则会出现UnicodeDecodeError或者乱码。
w_file = open("data.txt", "w", encoding="gbk")
w_file.write("你好中国")
w_file.close()# 当用不同的编码方式读取文件内容时会报错或者出现乱码
r_file = open("data.txt", "r", encoding="utf-8")
for line in r_file:print(line)
r_file.close()"""
会报错:UnicodeDecodeError: 
'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
"""

如何手动查看文本文件的编码方式

如何手动修改文本文件的编码方式:文件另存为时设置

读写二进制文件时

读写二进制文件时,在用open函数创建文件对象,不能使用encoding函数,否则会"ValueError: binary mode doesn't take an encoding argument"。而是在write函数前对需要写入的字符串内容进行encode,或者在read读到的内容后进行decode。
# 写入数据
file = open("data.txt", "wb")
data = "hello 中国"   # 字符串内容
file.write(data.encode("utf-8"))  # 将字符串内容按utf-8编码为二进制写入到文件中
# 这个时候去查看"data.txt"的编码就可以看到是 utf-8 编码了
file.close()# 读取数据
file = open("data.txt", "rb")
txt = file.read().decode("utf-8")
print(type(txt))  # <class 'str'>
print(txt)   # hello 中国
file.close()

5.文件指针位置

在创建文件时,文件指针位置在起始位置,在第 0 行的前面。每次读或写时,文件指针位置都会前移。

可以使用seek主动调整文件指针位置。

  • seek(arg1, arg2) 第一个参数是偏移量,第二个参数表示模式,0 表示开头,1 为中间,2 为末尾
  • file.seek(16, 0) 表示指针从开头的第 16 个字符起开始
  • file.seek(0, 0) 文件指针跳转到开头

tell 方法获取文件指针当前的位置

file = open("data.txt", "w")
file.write("1234567\n")
file.write("89\n")
file.write("xyz\n")
file.close()file = open("data.txt", "r")
print(f"index={file.tell()}\n")  # 1for i in range(12):ret = file.read(1)print(f"value=({ret})")  # 1print(f"index={file.tell()}\n")  # 1file.close()

运行结果

index=0value=(1)
index=1value=(2)
index=2value=(3)
index=3value=(4)
index=4value=(5)
index=5value=(6)
index=6value=(7)
index=18446744073709551624value=(
)
index=9value=(8)
index=10value=(9)
index=18446744073709551628value=(
)
index=13value=(x)
index=14

注意在换行符号"\n"处,文件指针跳动了两个单位,是因为windows下"\n"会自动变成"\r\n"。

6.文件缓存区与flush()方法

write 是写入内存的缓冲区,没有实时写入
等到 file.close()后再集中处理,或者缓冲区满了就真正写入
缓冲区的作用:磁盘是有寿命的,读取 or 写入一次寿命就会减少
import timefile = open("data.txt", "w")
file.write("abcdefg")file.flush()  # 刷新,实时写入
# 此时查看data.txt中会有数据"abcdefg",否则会等到file.close() 才有数据
# 有了这个语句就不怕忘记写 file.close()这个了time.sleep(30)
file.close()  # 文件是在文件关闭后才能写入,很重要

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子技术学习路线

在小破站上看到大佬李皆宁的技术路线分析&#xff0c;再结合自己这几年的工作。发现的确是这样&#xff0c;跟着大佬的技术路线去学习是会轻松很多&#xff0c;现在想想&#xff0c;这路线其实跟大学四年的学习顺序是很像的。 本期记录学习路线&#xff0c;方便日后查看。 传统…

京东Java社招面试题真题,最新面试题

Java中接口与抽象类的区别是什么&#xff1f; 1、定义方式&#xff1a; 接口是完全抽象的&#xff0c;只能定义抽象方法和常量&#xff0c;不能有实现&#xff1b;而抽象类可以有抽象方法和具体实现的方法&#xff0c;也可以定义成员变量。 2、实现与继承&#xff1a; 一个类…

FPGA之tcp/udp

在调试以太网的过程中&#xff0c;考虑了vivado IP配置(管脚、reset等)&#xff0c;SDK中PHY芯片的配置(芯片地址、自适应速率配置等)&#xff0c;但是&#xff0c;唯独忽略了tcp/udp协议&#xff0c;所以在ping通之后仍无法连接。 所以现在来学习一下tcp与udp的区别 ---- 为什…

浪潮信息IPF24:AI+时代,创新驱动未来,携手共创智慧新纪元

如今&#xff0c;数字化时代的浪潮席卷全球&#xff0c;人工智能已经成为推动社会进步的重要引擎。浪潮信息IPF24作为行业领先的AI技术盛会&#xff0c;不仅为业界提供了交流合作的平台&#xff0c;更在激发创新活力、拓展发展路径、加速AI技术落地等方面发挥了重要作用。 升级…

OS复习笔记ch6-2

死锁的解决 死锁的预防&#xff08;打疫苗&#xff09;死锁的避免&#xff08;戴口罩&#xff09;死锁的检测&#xff08;做核酸&#xff09; 死锁的预防 前面我们提到了死锁的四个必要条件 防止前三个必要条件&#xff0c;就是间接预防防止最后一个必要条件–循环等待&…

软测刷题-错题1

提高测试效率的方法&#xff1a; 1、不要做无效的测试 2.不要做重复的测试 3.不同测试版本的测试侧重点 4.优化测试顺序 LoadRunner是对服务器进行施压。 在数据库中存在的用户数是指注册用户数。 input标签可以直接使用send_keys实现上传&#xff0c;而非input标签是无法直…

Rust后台管理系统Salvo-admin源码编译

1.克隆salvo-admin后台管理系统源码: https://github.com/lyqgit/salvo-admin.git 2.编译 编译成功 3.创建mysql数据库与执行sql脚本 输入名称ry-vue 执行sql脚本 全部执行上面3个sql 修改数据库用户名与密码: 清理及重新编译 cargo clean cargo build 4.运行并测试 cargo…

使用vue,mybatis,mysql,tomcat,axios实现简单的登录注册功能

目录 第一步环境搭建 后端&#xff1a; 前端&#xff1a; 第二步画流程图 web: service: dao层&#xff1a; 第三步前端代码的实现 这是开始的页面&#xff0c;接下来我们要到router路由下书写#login的路径 路由中的component在我们自己创建的views书写vue文件…

单日收益1000+看了就会的项目,最新灵异短视频项目,简单好上手可放大操作

各位好友&#xff0c;佳哥在此与大伙儿聊聊一项神秘莫测的短视频项目。你或许会想&#xff0c;“又是一个视频创作项目&#xff1f;” 但别急&#xff0c;这个项目与众不同&#xff0c;日入千元不再是梦&#xff0c;而且它的易用性让人惊喜&#xff0c;无论你是初学者还是资深玩…

春秋云境CVE-2018-7422

简介 WordPress Plugin Site Editor LFI 正文 1.进入靶场 2.漏洞利用 /wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path/../../../../../../flag看别人wp做的。不懂怎么弄的&#xff0c;有没有大佬讲一下的

没有电商经验的人去操作抖音小店,难度大不大?好操作吗?

大家好&#xff0c;我是电商小V 很多新手小伙伴想去操作抖音小店项目&#xff0c;咨询的最多的问题就是我没有电商运营的经验可以去操作吗&#xff1f; 当然是可以操作的&#xff0c;抖音小店项目对于新手来说是一个非常友好的项目&#xff0c;很多小伙伴都是感觉没有电商经验去…

数据库攻防之MySQL

MySQL 是最流行的关系型数据库&#xff0c;与此同时也是 web 应用中最好的关系型数据库管理应用软件。我们在渗透过程中碰到的 PHP 站点大部分都会搭配 MySQL 数据库&#xff0c;因此它是红队攻防中最常遇到的数据库。 0x01 MySQL简介 MySQL 是典型的关系型数据库&#xff0c;…

YOLOv10 | 无NMS的YOLO | 实时端到端目标检测的新突破

过去几年里&#xff0c;YOLOs因在计算成本和检测性能之间实现有效平衡而成为实时目标检测领域的主流范式。研究人员针对YOLOs的结构设计、优化目标、数据增强策略等进行了深入探索&#xff0c;并取得了显著进展。然而&#xff0c;对非极大值抑制&#xff08;NMS&#xff09;的后…

redis--消息队列

分类 生产者消费模式 发布者订阅模式 生产者消费模式 在生产者消费者(Producer/Consumer)模式下&#xff0c;上层应用接收到的外部请求后开始处理其当前步骤的操作&#xff0c;在执行完成后将已经完成的操作发送至指定的频道(channel)当中&#xff0c;并由其下层的应用监听…

【Chrono Engine学习总结】6-创建自定义场景-6.2-chrono中的光线设置

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 上一篇文章中&#xff0c;自己【用sketchup重建了三维场景】&#xff0c;但导入chrono中颜色很不正确&#xff0c;几乎都是白色的&#xff0c;但也不是完全白色。经过…

IDE上传本地仓库到GitHub

IDE上传本地仓库到GitHub 1、选择远程仓库平台2、下载安装Git3、IDE集成Git4、本地项目上传GitHub 1、选择远程仓库平台 1.1、注册远程仓库平台 常见的远程仓库托管平台有&#xff1a; 1&#xff09;GitHub 域名&#xff1a;https://github.com 介绍&#xff1a;GitHub是全球最…

Java订餐系统源码 springboot点菜系统源码

Java订餐系统源码 springboot点菜系统源码 源码下载地址&#xff1a;https://download.csdn.net/download/xiaohua1992/89341358 功能介绍&#xff1a; 前台登录&#xff1a;前台登录&#xff1a; ①首页&#xff1a;菜品信息推荐、菜品信息展示、查看更多 ②菜品信息&…

地理信息系统(GIS)软件开发

地理信息系统&#xff08;GIS&#xff09;软件开发是一项复杂且系统性很强的工程&#xff0c;涉及空间数据的采集、管理、分析和展示。以下是一个典型的GIS软件开发流程&#xff0c;包括各个步骤的详细说明。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#…

面向对象------多态

1.多态的定义 通俗来说&#xff0c;当同一种行为或者事情发生在不同的对象上&#xff0c;这些行为或者事情最终得到的结果不同。 注意&#xff1a;多态要发生在继承的基础上。 例如&#xff1a;彩色打印机和黑白打印机。 彩色打印机和黑白打印机是不同的对象&#xff0c;但…

详细分析Element中的MessageBox基本知识(附Demo)

目录 前言1. 基本知识2. Demo2.1 确认框2.2 警告框2.3 对话框 3. this.$confirm 前言 详细知识推荐阅读&#xff1a;详细分析Element Plus中的ElMessageBox弹窗用法&#xff08;附Demo及模版&#xff09; MessageBox则常用于Vue2 1. 基本知识 MessageBox 是 Element UI 提供…