python中文件操作详解(1)

在python中我们经常会对文件进行一些常见的操作,比如打开文件,操作文件,关闭文件,此篇文章主要是记录自己在学习过程中的一些总结供大家学习,也欢迎查漏补缺~

1.文件的打开

   方式一:此种方式打开的文件需要手动将文件进行关闭

f1 = open(r'xxx', mode='r', encoding='utf-8')  
content = f1.read()  
print(content)  
f1.close()  

      f = open('文件路径', '编码方式', '操作方式')

     文件路径:可以是相对路径,也可以是绝对路径

路径的三种写法:

\\
file = open(‘C:\Users\chy\Desktop\Python\xxx.txt’)

r'\'
file = open(r’C:\Users\chy\Desktop\Python\xxx.txt’)

'/'(推荐)
file = open(‘C:/Users/chris/chy/Python/xxx.txt’)

     编码方式:可以不填写,默认是当前操作系统的编码,linux下默认是utf-8

     操作方式:只读(r),只写(w),写读,读写,追加等;如果是不写的话默认是只读模式r

   方法二:使用with语句进行打开文件(推荐使用此种方法)

with open(r'xxxx.txt', mode='r', encoding='utf-8') as f1:  
    content = f1.read()  
    print(content) 

优点1:不用手动关闭文件

with open('xxxxx', encoding='utf-8') as f1:  
    print(f1.read())

优点2:一个with语句可以操作多个文件

with open('xxx1', encoding='utf-8') as f1, \  
        open('xxxx2', encoding='utf-8', mode='w') as f2:  
    print(f1.read())  
    f2.write('ccccc')
2.文件的操作 

    (1)文件的读r,rb,r+,r+b

              r:只读模式,文件必须存在,不存在就会有异常

         rb:对于非文本文件,我们只能使用b模式。注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码  

f=open('c:\图片.jpg',mode='rb')
print(f.read())
f.close
输出结果是:b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x0…….

         r+:读写,先读写然后追加,一定要先读后写,否则会出现读取不到内容

#错误用法
f = open('log1.txt',encoding='utf-8',mode='r+')
f.write('345')  #先写,会将原来的内容给覆盖,然后文件指针放在文件最后
content = f.read()  #因为现在指针在文件最后导致读取的时候从最后一个位置进行读写就不会读出任何内容
print(content)  #输出的是空
f.close() 
#改进
f = open('log1.txt',encoding='utf-8',mode='r+')
f.write('345')  #先写,会将原来的内容给覆盖,然后文件指针放在文件最后
f.seek(0)  #会将文件指针给恢复到文件最开始
content = f.read()  #因为内容被覆盖了此时,读取到的内容是覆盖后的
print(content)  #输出的是345
f.close()

         r+b:文件以字节形式进行先读后以字节形式写,没有encoding。

path='c:\python\文件.txt'
f=open(path,mode='r+b')
print(f.read())
f.write(b'\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8')

    (2) 文件的写:w,wb,w+,w+b

               w:没有文件,创建文件;有文件,文件先清空,后写入

#写法1
f=open('xxx.txt',mode='w',encoding='utf-8')       #在相对路径下先创建这个文件
f.write('测试w模式的用法')
f.close
#写法二:
with open('xxx.txt',mode='w',encoding='utf-8') as f1:
    content=f1.write('测试w模式的用法')
    print(content)
    


          wb:以bytes写入,写入的内容,必须要转换为bytes类型才可以

#写入的内容直接是byte模式
with open('xxx','wb') as f1:
     f1.write(b'\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8')
     f1.seek(0)   #因为写入之后,光标会在最后一个指针所以需要将指针进行回退到文件的最开始
     content=f1.read()
     print(content)
#写入的不是byte内容,所以需要先转换成byte模式
with open('xxx','wb') as f1:
     f1.write('人生苦短,我想学Python'.encode(encoding="utf-8"))#str.encode()这个是函数转换
     content=f1.read()
     print(content)
     

      w+:写读,先写后读,但是此时光标已经移至最后,读出的内容可能只有一个换行符。但是可以通过改变光标位置进行读操作

with open('xxxx',mode='w+',encoding='utf-8') as f1:
    f1.write('ccc')
    print(f1.tell())     #tell()这个函数是输出指针当前的位置
    f1.seek(0)    #seek()这个函数是调整光标的位置,0代表将光标位置调整到句首
    content=f1.read()
    print(content)
 

    (3)文件的追加:a,ab,a+,a+b

               a:没有文件,创建文件追加,有文件,在文件后面追加,不支持读

with open('xxx',mode='a',encoding='utf-8') as f1:
   f1.seek(0)  #不管光标在哪里,都是在最后追加
   f1.write('adb')
3.文件的读取方式

    (1)全部读取出来 f.read()。全部读取,对于较大的文件,内存会负担不起      

with open('xxx.txt',encoding='utf-8') as f1:
    content = f1.read()
    print(content)

     (2) 读取一部分f.read(n)。在r模式下,read(n) 按照字符去读取。rb模式下按照字符的bytes模式读取

with  open('xxx.txt',encoding='utf-8') as f1:
    content=f1.read(3)     #代表从当前指针往后读取3个字符
    printcontent)

    (3) 一行一行的读 f.readline()按行读取,但是中间会有个换行符,这是因为每行文件末尾默认都有一个换行符

with open('xxxx',encoding='utf-8') as f1:
     f1.readline()    #读取完成以后此时指针会在第一行的末尾有个换行符
     f1.readlind()    #读取第二行,第一行跟第二行之间有个换行符

    (4) f.readlines() 按行读取,返回一个列表,列表中的每个元素就是每一行的字符串

with open('xxxx',encoding='utf-8') as f1:
    print(f1.readlins())

#返回的结果['11111111111111\n', '222222222222\n', '33333333333\n', '444444444abc']

    (5) for循环读取,在for循环中,每次读取一行,结束之后,内存就释放了。所以在整个for循环个过程中,始终只占用了一行内容的内存。推荐使用

with open('python1.txt',encoding='utf-8') as f1:
    for line in f1:
        print(line.strip())

  

4.文件的常用操作方法

  (1)f.seek():改变当前文件指针的位置,注意,移动的单位是byte(字节),所以如果是UTF-8的中文部分要3的倍数,意思就是一个字要三个字节

f.seek(offset,from_what)
  • from_what的值,从哪个位置进行偏移,如果是0表示开头,如果是1表示当前位置,2表示文件的结尾默认为0,即文件开头
  • seek(x,0):从文件首行首字符开始移动x个字符
  • seek(x,1):从当前为往后移动x个字符
  • seek(-x,2):从文件的结尾往前移动x个字符

(2)f.tell():使用tell()可以帮我们获取到当前光标在什么位置

with open("E:\PyCharm\\test.txt",mode ="r+",encoding = "utf-8") as f1:
    f1.seek(0)                   # 光标移动到开头
    f1.write("中国人")              # 写入信息,此时光标在9,因为中文3个字节代表一个字符3*3=9

    print(f1.tell())             # 此时获取光标所在的位置,中文一个字三个光标为一个字,因为中文3个字节代表一个字符
 
    f1.flush()                   # 刷新

     

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拉普拉斯算子

问Chat GPT两种不同拉普拉斯算子的区别:

【WEEK15】 【DAY1】异步任务【中文版】

2024.6.3 Monday 目录 17.异步、定时、邮件任务17.1.异步任务17.1.1.新建springboot-09-test项目17.1.2.创建一个service包17.1.2.1.创建一个类AsyncService 17.1.3.编写controller包17.1.3.1.编写AsyncController类 17.1.4.运行Springboot09TestApplication.java17.1.5.修改S…

下载ubuntu22.04

建议使用:清华源镜像 官网下载比较慢Ubuntu 22.04.4 LTS (Jammy Jellyfish) 打开清华源向下翻 然后找到22.04 下载完成:

牛客热题:矩阵最长递增路径

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:矩阵最长递增路径题目链接方法一…

vulhub中PHP利用GNU C Iconv将文件读取变成RCE(CVE-2024-2961)

GNU C 是一个标准的ISO C依赖库。在GNU C中,iconv()函数2.39及以前存在一处缓冲区溢出漏洞,这可能会导致应用程序崩溃或覆盖相邻变量。 如果一个PHP应用中存在任意文件读取漏洞,攻击者可以利用iconv()的这个CVE-2024-2961漏洞,将…

写一个盲盒模拟器

最近想写一个小程序,随便写一个玩吧,先想了下功能: 1.有很多盲盒,可以选择模拟开启 2.自定义盲盒,我们可以自定义制作盲盒自己玩 3.用户界面,记录盲盒历史,可以给坏越提意见 所用技术栈&…

Linux下互斥体的学习使用

文章目录 前言互斥锁的定义互斥锁的数据结构互斥锁的注意事项互斥锁API函数互斥锁的使用示例结语 前言 上篇我们讲过信号量,本篇讲下互斥体。本篇内核源码以内核5.10为例进行讲解 互斥锁的定义 其实信号量的值设置为1就可以使用信号量进行互斥访问了,…

中学生学人工智能系列:如何用AI学地理

经常有读者朋友给公众号《人工智能怎么学》留言咨询如何使用人工智能学习语文、数学、英语、化学等科目。这些都是中学教师、中学生朋友及其家长们普遍关注的问题。仅仅使用留言回复的方式,不可能对这些问题做出具体和透彻的解答,因此本公众号近期将推出…

Java—集合框架、时间和空间复杂度

一、集合框架 Java集合框架(Java Collection Framework),又称为容器(container),是定义在 java.util 包下的一组接口(interfaces)和其实现类(classes) 其主要表现为将多个元素(element)置于一个单元中,用于对这些元素进行快速、便捷的存储(…

纷享销客BI典型场景案例解析

本章以具体案例来说明纷享销客一体化BI智能分析平台为企业在实际使用过程中带来的价值。 1)场景一:销售经理想要在周会上关注各销售人员的客户及订单情况,并在每周一上午9点可以把上周的整体情况周期性的将报表推送给相关销售人员。 具体图表展示样式及…

人事管理系统有哪些优势?5大人事管理系统大盘点!

本人研究企业数字化转型10余年,为企业软件选型、数字化提供咨询服务!目前重点研究低代码数字化转型玩法,力争为各家企业探索出一条更具性价比的数字化方式。 人事管理系统有哪些优势?如何选择?又该怎样部署&#xff1…

UI设计公司-蓝蓝设计-交通行业ui设计解决方案

来百度APP畅享高清图片 这是北京兰亭妙微科技有限公司(简称蓝蓝设计)在交通行业的一些ui设计经验,我们建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习&#xff0…

springcloudalibaba项目注册nacos1.4.2,在nacos上修改配置项不生效问题

背景 之前的项目启动正常,后来发现springcloudalibaba的各版本匹配不正确,于是对项目中的springboot、springcloud、springcloudalibaba版本进行匹配升级,nacos1.4.2匹配的springboot、springcloud、springcloudalibaba版本与我的项目中的版本比较接近,于是我便重新安装了…

智能视频监控平台LntonCVS视频汇聚共享平台智慧楼宇应用方案

随着城市经济的迅速发展,大中型城市的写字楼数量不断增加。在像香港、台北、上海、北京等大城市,写字楼的安保成本相当高。为了降低这一成本,越来越多的物业公司开始采用技术手段。写字楼安防监控系统便是其中之一,它利用安全防范…

django 旅游服务系统-计算机毕业设计源码88939

摘 要 旅游服务系统采用采用django框架、python语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分,管理员管理主要功能包括:首页、轮播图(轮播图管理)、公告信息管理(公告信息)、资源管理&…

Informer

I n f o r m e r Informer Informer 摘要: 长序列时间序列的预测 i n f o r m e r informer informer优点: P r o b s p a r e Probspare Probspare自关注机制,在时间复杂度和内存使用方面达到 O ( N l o g N ) O(NlogN) O(NlogN),在序列依…

变量位置不同会死机?郭天祥老师视频的遗留问题分析答案

在郭天祥老师视频里有一个问题分享,是EXMC初始化里的一个变量定义和初始化位置不同会导致程序死机,最终定位到程序是进入hardfault死机,但暂时没有后续分析了,这里我们来继续分析一下。 死机的程序是这样的: 这段代码…

springboot集成uid-gengrator生成分布式id

一、简介 uid-generator是由百度技术部开发,GitHub地址 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器 Snowflake算法 Snowflake算法描述:指定机器 & 同一时刻 & 某一并发序列,是唯一的。据此可生成一个64 bits的唯一ID&#x…

SD6210A 低噪声可调电荷泵DC/DC转换器芯片IC

一般描述 该SD6210A是一种低噪声,恒定频率(1.20MHz)开关电容电压倍增器。它产生一个调节输出电压从2.8V到5V的输入与高达250mA的输出电流。低外部零件数(一个飞行电容器和两个小旁路电容的VIN和VOUT)使SD6210A非常适合小型,电池供电的应用新的电荷…

元宇宙数字藏品交易所,未来发展的大趋势

随着科技的飞速进步,元宇宙以其独特的魅力为数字世界绘制了一幅前所未有的宏伟蓝图。在这一宏大的背景下,数字藏品交易所作为连接虚拟与现实的桥梁,正以其卓越的优势,引领着数字藏品市场迈向新的高度。 首先,元宇宙为…