ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

day09 文件基础

2021-07-20 20:38:03  阅读:174  来源: 互联网

标签:文件 day09 utf 基础 模式 print txt open


今日内容概述

1.什么是文件?

2.为什么要用文件?

3.怎么使用文件?

4.文件的操作模式

5.主动控制文件内指针移动

今日内容详细

1.什么是文件?

文件是操作系统提供给用户或者说应用程序操作硬盘的一种功能

2.为什么要用文件?

读写文件就是在读写硬盘:我们对文件的读写操作都会被操作系统转换成硬盘的读写操作

应用程序-------------》文件对象、文件句柄
操作系统-------------》文件
硬件-----------------》硬盘

3.怎么使用文件?

  • 引入

应用程序运行过程中产生的数据最先都是存放在内存中的,要想永久保存,必须要保存在硬盘中。而应用程序要想操作硬盘必须通过操作系统,而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念,用户或者应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统完成对硬盘的具体操作。

  • 基本流程

有了文件的概念,我们就不需要考虑如何去操作硬盘,只需要考虑操作文件的流程:

# 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f = open('a.txt','r',encoding='utf-8')# 默认的打开模式就为'r'
# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作(通过句柄对文件进行操作)
data = f.read()
# 3.向操作系统发起关闭文件的请求,回收系统资源
f.close
f = open('a.txt','r')的过程分析
# 1. 由应用程序向操作系统发起系统调用open(...)
# 2. 操作系统打开该文件,并返回一个文件句柄给应用程序
# 3. 应用程序将文件句柄赋值给变量f
  • 资源的回收与with上下文管理

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

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

其中del f 一定要发生在f.close()之后,否则就会导致操作系统打开的文件无法关闭,导致资源的浪费,而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close(),虽然我们如此强调过这一点,但我们有时还会忘记f.close(),考虑到这一点,Python提供了with关键字来帮助我们管理上下文。

# 1、在执行完子代码块后,with 会自动执行f.close()
with open('a.txt','w') as f:
    pass
# 2、可用用with同时打开多个文件,用逗号分隔开即可
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
    data = read_f.read()
    write_f.write(data)

  • 指定操作文本文件的字符编码
f = open(...) # 是由操作系统打开文件,如果打开的是文本文档,会涉及字符编码问题,如果没有为open指定编码,那么打开文本文件的默认编码由操作系统决定,操作系统会用自己默认的编码去打开文件,字windows下是gbk,在linux下是utf-8.
f = open('a.txt','r',encoding='utf-8')

4.文件的操作模式

  • 控制文件读写操作的模式
# r(默认的):只读
# w:只写
# a:只追加写
  • 控制文件读写内容的模式
# t模式(默认的):读写都是以字符串为单位的,只适用于文本文件,必须指定encoding参数
# b模式:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数
# 大前提:t,b模式均不能单独使用,必须与r/w/a其中的一个结合使用
# t(默认):文本模式
# t模式:如果我们指定的文件打开模式为r/w/a,其实就是默认rt/wt/at
with open('a.txt',mode='rt',encoding='utf-8') as f:
    res = f.read()
    print(type(res))	# 输出结果为:<class 'str'>
   
with open('a.txt',mode ='wt',encoding='utf-8') as f:
    s='abc'
    f.write(s)	# 写入的也必须是字符串类型
  # 强调:t 模式只能用于操作文本文件,无论读写,都应该以字符串为单位,而存取硬盘本质都是二进制的形式,当指定 t 模式时,内部帮我们做了编码与解码
# b模式:(读写都是以二进制位为单位)
with pen('1.mp4',mode='rb') as f:
    data=f.read()
    print(type(data))	#输出结果为:<class 'bytes'>
   
with open('a.txt',mode='wb') as f:
    msg='你好
    res = msg.encode('utf-8')	# res为bytes类型
    ff.write(res) # 在b模式下写入文件只能是bytse类型
# b模式对比t模式
1.在操作纯文本方面t模式帮我们省去了编码和解码的环节,b模式则需要手动解码和编码,所以这时候t模式更方便
2.针对非文本文件(如图片、视频、音频等)只能使用b模式

  • 操作文件的方法
#掌握
f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中
# f.read()与f.readlines()d都是将内容一次性读入内存,这样如果容过大时会导致内存溢出,如果要全部读入内容,就需要分多次读入
# 方式一
with open('a.txt',mode='rt',encoding='utf-8') as f:
    for line in f:
        print(line)	# 同一时刻只读入一行内容到内存中
        
# 方式二
with open('1.mp4',mode='rb') as f:
    while True:
        data = f.read(1024)	# 同一时刻只读入1024个bytes到内存中
        if len(data)==0:
            break
        print(data)
# 写操作
f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

#了解
f.readable() #文件是否可读
f.writable() #文件是否可读
f.closed #文件是否关闭
f.encoding #如果文件打开模式为b,则没有该属性
f.flush() #立刻将文件内容从内存刷到硬盘
f.name
  • r模式的使用
# r模式:只读模式,如果文件不存在则报错,文件存在则文件指针位于文件的开头
f = open('a.txt',mode= 'rt',encoding= 'utf-8')
print(f.read())
print('='*50)
print(f.readable())
print(f.writeable())
f.close()
with open('a.txt',mode='r',encoding='utf-8') as f:
    res = f.read()	# 会将文件的内容由硬盘全部读入内存,赋值给res
# 实现用户认证功能
inp_nama = input('请输入你的用户名:').strip()
inp_pwd = input('请输入你的密码:').strip()
with open('a.txt',mode ='r',encoding='utf-8') as f:
    for line in f:
        u,p = line.strip('\n').split(':')
        if inp_name ==u and inp_pwd == p:
            print('登录成功')
            break
     else:
        print('用户名或密码错误')
  • w模式的使用
# w模式:只写模式,如果文件不存在则创建空文档,文件存在则清空,文件指针处于文件开头
# f = open('a.txt',mode='wt',encoding='utf-8')
# f.write('你好\n')
# f.write("哈哈哈\n")
# f.write("我擦勒\n")
# f.write('你好\n哈哈哈\n我擦勒\n')
# print(f.readable())
# print(f.writable())
# f.close()
# 总结,在w模式下,在打开了文件而不关的情况下,连续的write写入,新写入的内容永远跟在后面,如果重新以w模式打开文件,则会清空文件的内容
  • a模式的使用
# a模式,在打开了文件不关的情况下,连续的write写入,新写入的内容永远跟在后面,这一点与w模式相同
# 不同的是,在打开了文件之后关闭然后重新打开的情况下,a模式永远写在后面,切=且不会清空原文件内容
# 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
# f = open('c.txt',mode='a',encoding='utf-8')as f:
# f.write('6666\n')
# f.write('7777\n')
# print(f.readable)
# print(f.writable)
# f.close()    
# 实现注册功能:
  name=input('username>>>: ').strip()
  pwd=input('password>>>: ').strip()
  with open('db1.txt',mode='a',encoding='utf-8') as f:
      info='%s:%s\n' %(name,pwd)
      f.write(info)    
  • 主动控制文件内指针移动
# 大前提:文件内指针的移动都是以bytes为单位的,唯一例外的是t模式下的read(n),n代表的是字符的个数
with open('a.txt',mode='rt',encoding='utf-8') as f:
    data = f.read(3)	# 读取3个字符
with open('a.txt',mode='rb') as f :
    data =f.read(3)		# 读取3个bytes
    
# 之前文件内指针的移动都是由读/写操作而被动触发的,若想读取文件某一特定位置的数据,则则需要用f.seek方法主动控制文件内指针的移动,详细用法如下:
# f.seek(指针移动的字节数,模式控制): 
# 模式控制:

# 0 模式:默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
# a.txt用utf-8编码,内容如下(abc各占1个字节,中文“你好”各占3个字节)
        abc你好
# with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(3,0)		# 参照文件开头移动3个字节
print(f.tell())	# 查看当前文件指针距离文件开头的位置,输出结果为3
print(f.read())	# 从第三个字节的位置读到文件末尾,所以必须保证读取的内容是一个完整中文数据,否则解码失败报错
with open('a.txt',mode='rb') as f:
    f.seek(6,0)
    print(f.read().decode('utf-8')) #输出结果为: 好
    
# 1 模式:1模式的使用
with open('a.txt',mode='rb') as f:
    f.seek(3,1)	# 从当前位置往后移动3个字节,而此时的当前位置就是文件开头
    print(f.tell())	# 输出结果为:3
    f.seek(4,1)	# 从当前位置往后移动4个字节,而此时的当前位置为3
    print(f.tell())	# 输出结果为:7
   
# 2 模式:2模式的使用
with open('a.txt','rb') as f:
    f.seek(0,2)	# 参照文件末尾移动0个字节,即直接跳到文件末尾
    print(f.tell())	# 输出结果为:9
    f.seek(-3,2)	# 参照文件末尾向前移动了3个字节
    print(f.read().decode('utf-8'))	# 输出结果为:好
    
 

标签:文件,day09,utf,基础,模式,print,txt,open
来源: https://www.cnblogs.com/SSagittarius/p/15036863.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有