python文件处理之open()功能的使用part1

这篇具有很好参考价值的文章主要介绍了python文件处理之open()功能的使用part1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文件处理之open()功能的使用

一、引入

什么是文件?

文件是操作系统提供给用户或者是应用程序用于操作硬盘的虚拟概念或者说接口。

为什么要有文件?

用户通过应用程序可以通过文件,将数据永久保存到硬盘中。

详细的说:用户和应用程序操作的是文件,对文件的所有操作,都是向操作系统发送系统调用,然后再由操作系统将其转换成具体的硬盘的操作。

二、文件操作的基本流程

基本流程

伪代码实例:

    f = open(r'指定你要打开文件的文件路径', mode='rt,)
    r:
        raw_str,指的是原生得字符串,里面得反斜杠\,都会被视为普通字符。
    windows中路径分隔符解决方案:
        方案一(推荐):在文件路径前加r
        方案二:windows中会把左斜杠/,默认转换成右斜杠\。使用 'C:/a.txt/nb/c/d.txt',默认会转成 'C:\a.txt\nb\c\d.txt'
    绝对路径与相对路径:
        相对路径:会以你当前执行文件所在的文件夹下为基准去找。
            优点:简洁
            缺点:当你执行文件移动,被操作文件将找不到。
        绝对路径:从盘符的根目录下开始直接定位到你需要操作的文件地址。
            优点:执行文件移动到任意目录中都可以找到所需要操作的文件地址。
            缺点:臃肿
    rt:
        默认控制文件读写操作的模式是r,只读模式。
        默认控制文件读写内容的模式是t,t文本模式。
    
原理解析:
    f = open 占用了2部分的内存空间:
        第一部分:open占用的是操作系统的的内存空间。由操作系统的映射到了应用程序的内存空间中。
        第二部分:我们知道f的值是一种变量,而变量都是归属于python的内存空间,也就是说。f占用的就是应用程序的内存空间。

操作文件的基本流程:

# 1、打开文件
f = open(r'aaa/a.txt', mode='rt')   # open是向操作系统发起系统调用。# 2、操作文件:读写/文件
res = f.read()  # f.read()向操作系统发送请求,让操作系统把文件从硬盘读入内存。
print(res)
​
# 3、关闭文件
f.close()  # 告诉操作系统,回收刚刚读入文件内存占用的内存空间。(需要考虑的操作:操作系统打开文件,如果没有及时关闭,就会无意义的占用操作系统的内存空间,并且还会无意义的占用操作系统的操作文件数。如果没有指定关闭,操作系统不会立即清除该内存空间的占用,只有过了一定的时间,操作系统才会把没有意义的占用清除,而这种清除时间间隔对于我们来说感觉不到,但是对于计算机来说,是非常大的损耗。补充:操作系统打开文件的文件是有限的,如果开打文件过多,就会影响你的电脑性能。)f.read()  # 注意:f.close()之后,不能在对文件进行操作了。这个时候操作系统已经把调用的文件关闭回收了,如果继续调用就会报错(ValueError: I/O operation on closed file.)。del f  # 注意:del f 的顺序要放在f.close()后面。(不需要考虑的操作:有python的GC机制管理)

资源回收与with上下文管理

引入:

with称之为:上下文管理,上文帮你打开文件,下文帮你关闭文件。

强调:

open对应的赋值对象f,称之为文件对象、又有人称之为‘文件句柄’(柄:游戏手柄干嘛的?就是用来操作游戏的。那么我也也可以推理出,其实‘文件句柄’,就是用来远程控制文件的。)

打开一个文件包含两部分资源:应用程序的变量f和操作系统打开的文件。在操作完毕一个文件时,必须把与该文件的这两部分资源全部回收,回收方法为:

1、f.close() #回收操作系统打开的文件资源
2、del f #回收应用程序级的变量

其中del f一定要在f.closs()之后,否则就会导致系统文件打开无法关闭,白白占用了资源,而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close(),虽然我们如此强调,但是大多数读者还是会不由自主地忘记f.close(),考虑到这一点,python提供了with关键字来帮我们管理上下文

# 1、with打开单个文件
with open('a.txt', mode='rt') as f:     
    res = f.read()
    print(res)
# 上面没有指定f.close(), with会等其子代码块群不运行完毕以后,会帮你自动调用f.close()。
​
​
# 2、with同时打开多个文件,用逗号分隔开即可
# with open('a.txt', mode='rt') as f1, open('b.txt', mode='rt') as f2:  # 当你的一行代码过长,可以使用右斜杠\(注意:右斜杠\并不是换行,而是转义且分隔。)
with open('a.txt', mode='rt') as f1, \
        open('b.txt', mode='rt') as f2:
    res1 = f1.read()
    res2 = f2.read()
    print(res1)
    print(res2)

指定操作文本文件的字符编码

  • 上面没有指定操作文本的字符编码,接下来我们需要指定:

    f = open(...)是由操作系统打开文件,如果打开的是文本文件,会涉及到字符编码问题,如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8
    这就用到了字符编码的问题:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。f = open('a.txt','r',encoding='utf-8')
    ​
    

文件的操作模式

控制文件读写的操作模式

  • r(默认的):只读

  • w:只写

  • a:之追加写

r模式的使用:只读模式

特点:当文件不存在时,r模式会报错。当文件存在时,文件指针跳到开始位置,也就是说从文件开头位置开始。只能读,不能写。

""""
先手动创建c.txt文件文件,文件内容如下:
哈哈哈哈
""""
# 1、以t模式为基础进行内存操作
with open('c.txt', mode='rt', encoding='utf-8') as f:
    print('res'.center(50, '-'))
    res = f.read()  # 执行f.read(),文件指针从开头一下子跳到文件末尾,同时也把文件内容一次性由硬盘读入内存。问题❓ 当文件过大时,会把内存干懵!!!
    print(res)
​
    print('res1'.center(50, '-'))
    res1 = f.read()  # 注意:上面执行了f.read()操作,文件指针在末尾,这个时候怎么读。都读不出来了。
    print(res1)
​
    # 注意:上面读出文件的每行内容,在每行内容末尾都有个换行符\n。
'''
-----------------------res------------------------
哈哈哈哈
-----------------------res1-----------------------
'''
    
# 2、案例:优化之前的用户登录操作,之前的用户站账户信息不能永久保存,这里我们通过存入文件将用户账户信息永久保存。网址连接(第9题:编写用户登录接口写法一):https://www.cnblogs.com/yang1333/p/12357167.html
# 经验总结:for+else,用于用户登录功能中时,else中的子代码块放用户登录失败以后的打印信息。要知道用户登录成功,一定是break退出循环,这个else错误信息也就不执行,也没有执行的必要。但是反过来说,用户登录失败,break语句也就一定不会执行到,那么else中的子代码块的执行,也就不会被break打段。
'''
先手动创建user.txt文件文件,文件内容如下:
egon:123
lili:456
jack:777
tom:666
'''
inp_username = input("please input your username>>:").strip()
inp_password = input("please input your password>>:").strip()
​
with open('user.txt', mode='rt', encoding='utf-8') as f:
    for line in f:  # 遍历文件对象,line取出的是文件中的每1行的内容。(注意:取出的内容都是str类型,且每一行的末尾都有换行符\n,直接打印print(line)看不到,所以下面使用print([line])放入列表中显示)
        # print([line])
        # line.split()  # 注意:不能直接使用split(),因为文件每行内容末尾(除了最后1行文件内容没有换行符)都有换行符\n,我们要像下面?一样先使用strip()去除\n。
        res = line.strip()  # 使用strip()默认不加参数,去除空白,需要注意的是 \n这个换行符也叫空白符,也可以去除。
        # print([res])
​
        # 使用split(':')切分字符串,转换成列表。第一个值作为用户账号,第二个值作为用户密码。
        username, password = res.split(':')
        if username == inp_username and password == inp_password:
            print('登录成功!')
            break
    else:
        print('登陆失败!账号或密码错误!')

w模式的使用:只写模式

特点:只写模式,当文件不存在时,会创建空文件。当文件存在时,会清空文件。文件指针位于开始位置。不可读,只能写。

强调:

  1. 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面

  2. 如果重新以w模式打开文件,则会清空文件内容

# 1、引入
with open('d.txt', mode='wt', encoding='utf-8') as f:
    # f.read()  # 不可读,只能写。
    f.write('哈哈哈哈我擦嘞\n')  # 注意:每一次运行,在w模式下,都会先清空原内容。文件指针位于开始位置。(提示:这里的\n是位-------)
'''
d.txt文件中显示结果:
哈哈哈哈我擦嘞'''    
    
# 1.1 强调1:w模式打开文件没有关闭的情况下,连续的写,新的内存总是更在旧的之后。
with open('d.txt', mode='wt', encoding='utf-8') as f:
    f.write('我擦嘞1\n')
    f.write('我擦嘞2\n')
    f.write('我擦嘞3\n')
'''
d.txt文件中显示结果:
我擦嘞1
我擦嘞2
我擦嘞3'''
    
# 1.2 强调2:重新以w模式开打文件,则会先清空文件内容。
with open('d.txt', mode='wt', encoding='utf-8') as f:
    f.write('我擦嘞1\n')
with open('d.txt', mode='wt', encoding='utf-8') as f:
    f.write('我擦嘞2\n')    
with open('d.txt', mode='wt', encoding='utf-8') as f:
    f.write('我擦嘞3\n') 
# 以上内容,d.txt文件中,只有:我擦嘞3\n# 2、案例:w模式用来创建全新文件(应用:文件与文件的copy工具)
'''
# 2.1 下面的内容属于拓展内容:(注意:如果该内容没有添加,必须保证输入的源路径存在,没有存在,程序则会报错。)
import ossource_file = input("源文件路径>>:").strip()
destination_file = input("目标路径>>:").strip()# 先判断源文件路径在不在,不在帮助用户在指定路径下创建源文件及其内容
if not os.path.isfile(source_file):
    with open(r'{}'.format(source_file), mode='wt', encoding="utf-8") as f:
        for i in range(4):
            f.write('我擦嘞:%s\n' % i)
'''# 2.2 实际内容:
with open(r'{}'.format(source_file), mode='rt', encoding='utf-8') as f,\
        open(r'{}'.format(destination_file), mode='wt', encoding='utf-8') as f1:
    # 将读出的源文件内容,写入用户指定的目标件中
    # source_file_content = f.read()
    # f1.write(source_file_content)
​
    # 优化:?上面2步我们发现使用的是f.read(),它是一下子把文件从硬盘读入内存,如果文件过大,会把内存干懵逼!
    for line in f:
        f1.write(line)        

a模式的使用:只追加写模式

特点:只追加写。在文件不存在时,会创建空文档,文件指针只能在开头,其实这里的开头也是末尾。在文件存在时,文件指针会直接跳到文件内容末尾。不能读,只能追加写。

总结:a模式与w模式区别以及a模式与w模式作用如下:

a模式与w模式区别:

  • 相同之处:在文件打开不关闭的情况下,连续的写入,新写的内容总会跟在之前写的内容之后。

  • 不同之处:a模式重新开打文件,只要打开文件,它的指针就会跳到末尾。w模式重新打开文件,直接清空文件。

a模式与w模式作用:

  • w模式用来创建新文件。(通常用来copy文件)

  • a模式争对老文件。(通常用来记录日志文件,通常用与用户注册)文章来源地址https://www.toymoban.com/news/detail-403133.html

# 1、引入
with open('e.txt', mode='at', encoding='utf-8') as f:
    f.write('我擦嘞1\n')
    f.write('我擦嘞2\n')
    f.write('我擦嘞3\n')  
   
# 2、a模式案例:实现用户注册功能(每来一个用户,打开文件,把新用户的信息追加写到已存在的用户账户末尾。)
"""
# 2.1 下面的内容属于拓展内容:
import osif not os.path.isfile('user.txt'):
    with open(r'user.txt', mode='wt', encoding='utf-8') as f:
        f.write('egon:123\nalex:alex3714\n')register = False
while True:
    username = input('请输入注册账号>>:').strip()
    password = input('请输入注册密码>>:').strip()
    confirm_password = input('请确认注册密码>>:').strip()    # 如果username,password,confirm_password有一个为空那么让用户重新注册
    if '' in [username, password, confirm_password]:
        print('注册账号、注册密码、确认注册密码不能为空。')
        continue
    # 如果用户2次密码不一致,那么让用户重新注册
    if password != confirm_password:
        print('用户2次密码不一致')
        continue
        # 如果用户以及存在,那么让用户重新注册
    with open(r'user.txt', mode='rt', encoding='utf-8') as f:
        for line in f:
            if username == line.strip().split(':')[0]:
                print('用户已经存在,重新注册')
                break
        else:
            register = True
            print('正在为您注册中'.center(50, '-'))
            import time
            time.sleep(2)
    if not register:
        continue    # 用户注册满足条件,写入文件,注册该用户
    with open(r'user.txt', mode='at', encoding="utf-8") as f:
        f.write('{}:{}\n'.format(username, password))
    print('恭喜你!注册成功!'.center(50, '-'))
    break
"""# 2.2 实际内容:
username = input('your useranem>>:').strip()
password = input('your password>>:').strip()
with open(r'db.txt', mode='at', encoding='utf-8') as f:
    f.write(f'{username}:{password}\n')

+ 模式的使用(了解):r+、w+、a+模式

# r+ w+ a+ :可读可写
#在平时工作中,我们只单纯使用r/w/a,要么只读,要么只写,一般不用可读可写的模式
"""
注意:+不能单独使用,必须配合r、w、a
"""
# 1、r+模式:以r基准,g.txt文件不存在,直接就报错
'''
提前创建user.txt文件,写入以下内容:
111
222
333
444
5555
444
5555中国
中国
中国'''
with open('g.txt', mode='rt+', encoding='utf-8') as f:
    print(f.read())  
    f.write('中国\n')  # 如果上面执行了f.read()操作,文件指针默认就会移动到文件末尾,f.write('中国\n')操作就会把内容写入到文件末尾。(类似于a操作)如果上面没有执行f.read()操作,文件指针默认在开始位置,输入的内容多少,就会把g.txt中的原内容覆盖多少。# 2、w+模式:以w基准
with open('h.txt', mode='w+t', encoding='utf-8') as f:
    f.write('111\n')
    f.write('222\n')
    f.write('333\n')
    # w模式打开文件,清空源文件,文件指针在起始位置。以上f.write操作会按照先后顺序写入h.tx文件。
    print('=======>', f.read()) 
    # ?上面使用f.read()操作,这个时候文件指针在末尾,并不能读出任何内容。# 3、a+模式:以a基准    
with open('g.txt',mode='at+',encoding='utf-8') as f:
    # print('f.read()')  # a模式下,一打开文件,文件指针就在末尾。f.read()操作并不能读出任何文件内容。
    f.write('中国')  # 更具上面得知文件指针就在末尾,f.write操作会把输入的内容追加到文件内容的末尾去。
	

到了这里,关于python文件处理之open()功能的使用part1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划(一) part1

    T1:一个数组 中的最长 升序 子序列 的长度 给你一个整数数组  nums  ,找到其中最长严格递增子序列的长度。 子序列  是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如, [3,6,2,7]  是数组  [0,3,1,6,2,2,7]  的子序列。 解: 1.关键 (1)

    2023年04月19日
    浏览(80)
  • Redis项目 PART1

    第一部分:含注册登入+商户查询(使用缓存) 使用redis而不用传统的session的原因(session共享问题):每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat,并且把自己的信息存放到第一台服务器的session中,但是第二次这个用户访问到了第二台tomcat,那么在第

    2024年02月16日
    浏览(41)
  • SwiftUI 布局协议 - Part1

    今年 SwiftUI 新增最好的功能之一必须是布局协议。它不但让我们参与到布局过程中,而且也给了我们一个很好的机会去更好的理解布局在 SwiftUI 中的作用。 早在2019年,我写了一篇文章 SwiftUI 中 frame 的表现 ,其中,我阐述了父视图和子视图如何协调形成最终视图效果。那里描

    2024年02月05日
    浏览(46)
  • 计算机网络 Part1

    目录 计算机网络的一些术语: 计算机网络的重点: 整体结构以及HTTP部分一些问题: TCP以及UDP相关的问题: DNS以及网络安全相关的问题: 1. OSI七层模型的每一层分别是什么?对应的协议有哪些? 传输层协议和网络层协议有什么区别?   HTTP协议为什么设计为无状态的? H

    2024年02月12日
    浏览(39)
  • Open3D图像处理功能详解:Python中强大的三维图像库

    Open3D图像处理功能详解:Python中强大的三维图像库 Open3D是一款在Python语言中使用的开源3D图形库,以其强大的功能和易用性而被广泛应用于计算机视觉、机器人技术、虚拟现实等领域。其中,Open3D提供了完善的图像处理工具,使得Python开发者可以便捷地进行三维图像的处理和

    2024年02月12日
    浏览(49)
  • Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习——计算机图形学世界中相机的工作原理

    是否有一种方法可以仅从一个场景多张不同视角的照片中捕获整个3D场景? 有。 NeRF:将场景表示为用于视图合成的神经辐射场中(NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis),Mildenhall等人(2020)的论文解答了这个问题。NeRF的更简单实现赢得了 TensorFlow社区聚光

    2024年02月07日
    浏览(50)
  • 当代软件工程师技术面试准备Part1

    当代软件工程师技术面试准备Part1 一. 编码 - Leetcode     LeetCode 是一个在线的编程练习平台,专注于帮助程序员提升他们的编程技能。该平台提供了大量的算法和数据结构问题,涵盖了各种难度级别,从简单到困难。LeetCode的主要目标是帮助程序员准备技术面试,特别是在软

    2024年02月03日
    浏览(53)
  • Leetcode with Golang 滑动窗口 Part1

    滑动窗口的定义: 滑动窗口这一个技巧主要运用于处理数组问题上,一般用于“子串”问题。精髓是,维护一个里面装着元素的“窗口”,在将新元素装进“窗口”的同时,根据题意,把不符合题意的元素踢出“窗口”。 滑动窗口的模板: 接下来看几道题目: Leetcode 209.长

    2024年01月19日
    浏览(44)
  • NzN的数据结构--二叉树part1

            你叉叉,让你学数据结构你不学;你叉叉,让你看二叉树你不看。 今天我们来一起学习二叉树部分, 先赞后看是好习惯 。           树是一种 非线性 的数据结构,它是由n(n=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂

    2024年04月13日
    浏览(71)
  • 第七章:敏捷开发工具方法-part1-敏捷开发基础

    敏捷开发背景 速度是企业竞争致胜的关键因素,软件项目的最大挑战在于一方面需要应付变动中的需求,一方面需要在有限的时间完成项目,传统的软件工程难以满足这些要求 所以软件团队除了在技术上必须日益精进,更需要运用有效的开发流程,以确保团队能够发挥综效

    2024年02月09日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包