打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【2020Python修炼记】Python语法入门

【目录】

1、什么是文件

2、为何要用文件

3、如何使用文件

3.1 基本操作流程

3.1.1 基本流程

3.1.2 with上下文管理

3.1.3 指定字符编码

3.2 模式介绍

3.3 文件的操作模式

3.3.1 控制文件读写内容的模式

3.3.2 控制文件读写操作的模式

3.4 操作文件的其他方法

3.5主动控制文件内指针移动

3.6文件的修改 

1、什么是文件 

文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟的概念/接口

 ==计算机三大层次结构==

用户/应用程序(open())    

操作系统(文件)    

计算机硬件(硬盘) 

2、为何要用文件

 ==保存数据==

用户/应用程序 可以通过文件将数据永久保存的硬盘中 ,即操作文件就是操作硬盘

==读取数据==

用户/应用程序 直接操作的是文件,对文件进行的所有的操作,都是在向操作系统发送系统调用,然后再由操作将其转换成具体的硬盘操作

3、如何使用文件

3.1 基本操作流程 

3.1.1 基本流程

=1=打开文件——文件句柄 :open('文件路径', '模式')

=Windows路径分隔符问题

 open('C:\a.txt\nb\c\d.txt')# 解决方案一:推荐(windows系统的路径是用 \ 间隔) open(r'C:\a.txt\nb\c\d.txt')# 解决方案二:(Linux系统的路径是用 / 间隔) open('C:/a.txt/nb/c/d.txt')
f=open(r'aaa/a.txt',mode='rt') # f的值是一种变量,占用的是应用程序的内存空间.
r 的作用是避免路径中出现的‘\n’被解释器识别为转义字符
# print(f)# x=int(10)

f=open('a.txt','r')的过程分析
#1、由应用程序向操作系统发起系统调用open(...)
#2、操作系统打开该文件,并返回一个文件句柄给应用程序
#3、应用程序将文件句柄赋值给变量f

=绝对路径和相对路径

 https://www.cnblogs.com/bigorangecc/p/11179863.html

=2=操作文件:读/写文件—— res=f.read()   res=f.write()

 读/写文件,应用程序对文件的读写请求都是在向操作系统发送系统调用,然后由操作系统控制硬盘把输入读入内存、或者写入硬盘

res=f.read()print(type(res))# print(res)

=3=关闭文件 —— f.close()

f.close() # 回收操作系统资源print(f)f.read() # 变量f存在,但是不能再读了del f     # 回收应用程序资源

3.1.2  with上下文管理

=1= 作用一:为了防止遗漏 f.close() 

# 文件对象又称为文件句柄# with open('a.txt',mode='rt') as f1: # f1=open('a.txt',mode='rt')#     res=f1.read()#     print(res)

=2= 作用二:一次读取多个文件 

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)    # f1.close()    # f2.close()

 

 3.1.3 指定字符编码

强调:t 和 b不能单独使用,必须跟r/w/a连用

t文本(默认的模式)

1、读写都以str(unicode)为单位的

2、文本文件

3、必须指定encoding='utf-8'

# 没有指定encoding参数操作系统会使用自己默认的编码# linux系统默认utf-8# windows系统默认gbkwith open('c.txt',mode='rt',encoding='utf-8') as f:    res=f.read()          # t模式会将f.read()读出的结果解码成unicode    print(res,type(res))# 内存:utf-8格式的二进制-----解码-----》unicode# 硬盘(c.txt内容:utf-8格式的二进制)

3.2 模式介绍

=1= 模式一:控制文件读写内容的模式—— t 和 b

强调:t 和 b 不能单独使用,必须跟r / w / a 连用

t 模式

1、读写都是以字符串(unicode)为单位

2、只能针对文本文件

3、必须指定字符编码,即必须指定encoding参数

b 模式(binary模式)

1、读写都是以字节bytes为单位   

2、可以针对所有文件   

3、一定不能指定字符编码,即一定不能指定encoding参数

总结:

1、在操作纯文本文件方面,t 模式帮我们省去了编码与解码的环节,b 模式则需要手动编码与解码,所以此时 t 模式 更为方便
2、针对非文本文件(如图片、视频、音频等)只能使用b模式

=2= 模式二:控制文本读写操作的模式—— r /w / a / +

 r—只读模式

 w—只写模式

 a—只追加写模式

 +—r+、w+、a+

 x—只写模式

3.3 文件的操作模式 

3.3.1 控制文件读写内容的模式

1、t 模式

 t模式只能读文本文件

# 错误演示:t模式只能读文本文件with open(r'爱情公寓.mp4',mode='rt') as f:     f.read()  # 硬盘的二进制读入内存-》t模式会将读入内存的内容进行decode解码操作
with open(r'd.txt',mode='rt',encoding='utf-8') as f:     res=f.read() # utf-8的二进制->unicode     print(res)

2、b 模式

 2.1 读取图片

with open(r'test.jpg',mode='rb',encoding='utf-8') as f:    res=f.read() # 硬盘的二进制读入内存—>b模式下,不做任何转换,直接读入内存    print(res) # bytes类型—》当成二进制    print(type(res))

2.2 读取文本文件

with open(r'd.txt',mode='rb') as f:    res=f.read() # utf-8的二进制    print(res,type(res))    print(res.decode('utf-8'))

2.3 b模式下写入文件

with open(r'f.txt',mode='wb') as f:    f.write('你好hello'.encode('utf-8'))    f.write('哈哈哈'.encode('gbk'))

2.4 案例——改写文件copy工具

# 文件拷贝工具src_file=input('源文件路径>>: ').strip()dst_file=input('源文件路径>>: ').strip()with open(r'{}'.format(src_file),mode='rb') as f1,    open(r'{}'.format(dst_file),mode='wb') as f2:    # res=f1.read() # 内存占用过大    # f2.write(res)    for line in f1: #推荐使用        f2.write(line)

3、案例分析——r、b对比—循环读取文件

方式一:自己控制每次读取的数据的数据量with open(r'test.jpg',mode='rb') as f:    while True:        res=f.read(1024) # 1024        if len(res) == 0:            break        print(len(res))方式二:以行为单位读,当一行内容过长时会导致一次性读入内容的数据量过大with open(r'g.txt',mode='rt',encoding='utf-8') as f:    for line in f:        print(len(line),line)with open(r'g.txt',mode='rb') as f:    for line in f:        print(line)with open(r'test.jpg',mode='rb') as f:    for line in f:        print(line)
 

3.3.2 控制文件读写操作的模式——以 t 模式为基础进行内存操作

1、r(默认的操作模式):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置

with open('c.txt',mode='rt',encoding='utf-8') as f:    print('第一次读'.center(50,'*'))    res=f.read() # 把所有内容从硬盘读入内存    print(res)with open('c.txt', mode='rt', encoding='utf-8') as f:    print('第二次读'.center(50,'*'))    res1=f.read()    print(res1)

案例一 :用户登入验证

用户登入验证:

inp_username=input('your name>>: ').strip()inp_password=input('your password>>: ').strip()# 验证with open('user.txt',mode='rt',encoding='utf-8') as f: for line in f: # print(line,end='') # egon:123\n username,password=line.strip().split(':') if inp_username == username and inp_password == password: print('login successfull') break else: print('账号或密码错误')

2、w:只写模式,当文件不存在时会创建空文件,当文件存在会清空文件,指针位于开始位置

with open('d.txt',mode='wt',encoding='utf-8') as f:    f.read() # 报错,不可读    f.write('擦勒\n')强调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')强调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')

案例二 :w模式用来创建全新的文件——文本文件的copy工具

文本文件的copy工具

src_file=input('源文件路径>>: ').strip()dst_file=input('源文件路径>>: ').strip()with open(r'{}'.format(src_file),mode='rt',encoding='utf-8') as f1, open(r'{}'.format(dst_file),mode='wt',encoding='utf-8') as f2: res=f1.read() f2.write(res)

3、a:只追加写,在文件不存在时会创建空文档,在文件存在时文件指针会直接调到末尾

with open('e.txt',mode='at',encoding='utf-8') as f:    # f.read() # 报错,不能读    f.write('擦嘞1\n')    f.write('擦嘞2\n')    f.write('擦嘞3\n')强调 w 模式与 a 模式的异同:1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后

案例三:a模式用来在原有的文件内存的基础之上写入新的内容,比如记录日志、注册

注册功能name=input('your name>>: ')pwd=input('your code>>: ')with open('db.txt',mode='at',encoding='utf-8') as f:    f.write('{}:{}\n'.format(name,pwd))

4、了解:

+不能单独使用,必须配合r、w、a

with open('g.txt',mode='r+t',encoding='utf-8') as f:    # print(f.read())    f.write('中国')with open('g.txt',mode='w+t',encoding='utf-8') as f:    f.write('111\n')    f.write('222\n')    f.write('333\n')    print('====>',f.read())with open('g.txt',mode='a+t',encoding='utf-8') as f:    print(f.read())    f.write('444\n')    f.write('5555\n')    print(f.read())

 x,只写模式【不可读;不存在则创建,存在则报错】,x+【写读--可读,可写】,xb

with open('a.txt',mode='x',encoding='utf-8') as f:    passwith open('c.txt',mode='x',encoding='utf-8') as f:    f.read()with open('d.txt',mode='x',encoding='utf-8') as f:    f.write('哈哈哈\n')

 

3.4 文件操作的其他方法

=1= 读相关操作

f.read() # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾

f.readline() # 读取一行内容,光标移动到第二行首部

f.readlines() # 读取每一行内容,存放于列表中

=1、readline() —— 一次读一行

with open(r'g.txt',mode='rt',encoding='utf-8') as f:    # res2=f.readline()    # print(res2)    while True: #也可以用while实现        line=f.readline()        if len(line) == 0:            break        print(line)


=2、readlines()

with open(r'g.txt',mode='rt',encoding='utf-8') as f:    res=f.readlines()    print(res)

# 强调: 

f.read() 与 f.readlines()都是将内容一次性读入内存,如果内容过大会导致内存溢出,若还想将内容全读入内存,则必须分多次读入,有两种实现方式:

(同-循环读取文件)

# 方式一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)

=2= 写相关操作

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模式

=1、f.writelines():

with open('h.txt',mode='wt',encoding='utf-8') as f:    # f.write('1111\n222\n3333\n')    # l=['11111\n','2222','3333',4444]    l=['11111\n','2222','3333']    # for line in l:    #     f.write(line)    f.writelines(l)
with open('h.txt', mode='wb') as f:    # l = [    #     '1111aaa1\n'.encode('utf-8'),    #     '222bb2'.encode('utf-8'),    #     '33eee33'.encode('utf-8')    # ]    # 补充1:如果是纯英文字符,可以直接加前缀b得到bytes类型    # l = [    #     b'1111aaa1\n',    #     b'222bb2',    #     b'33eee33'    # ]    # 补充2:'上'.encode('utf-8') 等同于bytes('上',encoding='utf-8')    l = [        bytes('上啊',encoding='utf-8'),        bytes('冲呀',encoding='utf-8'),        bytes('小超人们',encoding='utf-8'),    ]    f.writelines(l)

=2、 flush() ,强制写入数据

with open('h.txt', mode='wt',encoding='utf-8') as f:    f.write('')    # f.flush()

=3、了解

f.readable() # 文件是否可读
f.writable() # 文件是否可写
f.closed # 文件是否关闭
f.encoding # 如果文件打开模式为b,则没有该属性
f.flush() # 立刻将文件内容从内存刷到硬盘,即强制写入硬盘
f.name

with open('h.txt', mode='wt',encoding='utf-8') as f:    print(f.readable())    print(f.writable())    print(f.encoding)    print(f.name)    print(f.closed)

3.5 主动控制文件内指针移动

=1=  指针移动的单位都是以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

=2= f.seek(指针移动的字节数,模式控制)

# 之前文件内指针的移动都是由 读/写操作 而被动触发的
若想读取文件某一特定位置的数据,则需要用f.seek()方法 主动控制文件内指针的移动。
详细用法如下:

# f.seek(指针移动的字节数,模式控制):
# 模式控制:
# 0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
# 1: 该模式代表指针移动的字节数是以当前所在的位置为参照的
# 2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的
# 强调:其中0模式可以在t模式或者b模式使用,而1跟2模式只能在b模式下用
 
模式:0模式:参照物是文件开头位置f.seek(9,0)f.seek(3,0) # 指针停在索引3的位置1模式:参照物是当前指针所在位置f.seek(9,1)f.seek(3,1) # 122模式:参照物是文件末尾位置,应该倒着移动f.seek(-9,2) # 3f.seek(-3,2) # 9

=3= f.tell() # 获取文件指针当前位置 

示范with open('aaa.txt',mode='rb') as f:    f.seek(9,0)    f.seek(3,0) # 3    # print(f.tell())    f.seek(4,0)    res=f.read()    print(res.decode('utf-8'))with open('aaa.txt',mode='rb') as f:    f.seek(9,1)    f.seek(3,1) # 12    print(f.tell())with open('aaa.txt',mode='rb') as f:    f.seek(-9,2)    # print(f.tell())    f.seek(-3,2)    # print(f.tell())    print(f.read().decode('utf-8'))

3.6 文件的修改 

# 文件a.txt内容如下张一蛋     山东    179    49    12344234523李二蛋     河北    163    57    13913453521王全蛋     山西    153    62    18651433422# 执行操作with open('a.txt',mode='r+t',encoding='utf-8') as f:    f.seek(9)    f.write('<妇女主任>')# 文件修改后的内容如下张一蛋<妇女主任> 179    49    12344234523李二蛋     河北    163    57    13913453521王全蛋     山西    153    62    18651433422# 强调:# 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容# 2、内存中的数据是可以修改的

文件对应的是硬盘空间,硬盘不能修改对应着文件本质也不能修改, 那我们看到文件的内容可以修改,是如何实现的呢?

大致的思路是: 将硬盘中文件内容读入内存,然后在内存中修改完毕后再覆盖回硬盘

具体的实现方式分为两种:

 =1= 文件修改方式一

# 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存

一般是文本编辑器使用的文件修改方式

with open('db.txt',mode='rt',encoding='utf-8') as f:    data=f.read()with open('db.txt',mode='wt',encoding='utf-8') as f:    f.write(data.replace('kevin','SB'))

 =2= 文件修改方式二

# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,

                     删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份

多用于程序里的文件修改

import os with open('db.txt',mode='rt',encoding='utf-8') as read_f,        open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:  #.db.txt.swap 是Linux系统的命名规则,‘.’开头是隐藏文件    for line in read_f:        wrife_f.write(line.replace('SB','kevin'))os.remove('db.txt') # 删除原文件os.rename('.db.txt.swap','db.txt') #将新文件重命名为原文件名 

 

https://www.cnblogs.com/bigorangecc/p/12552940.html

参考资料:

https://www.cnblogs.com/linhaifeng/articles/5984922.html

https://zhuanlan.zhihu.com/p/108808704

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【python3之文件操作】
一文详解Python文件操作
Python open()文件处理使用介绍
第93天:文件读写
Python 基础(十二):文件基本操作
Python自动化测试之文件基础操作
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服