Python基本文件操作

引言:

1什么是文件:

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

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

操作系统(文件)

计算机硬件(硬盘)

2为何要用文件

用户/应用程序可以通过文件将数据永久的保存在硬盘中

操作文件就是操作硬盘

用户/应用程序直接操作的是文件,对文件的进行的所有操作,都是

在向操作系统发送系统调用,然后再由操作系统将其转换为具体的硬盘操作

3如何用文件: open()

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

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

t文本模式(默认的模式)

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

2只针对文本文件

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

b二进制/bytes

二:控制文件读写操作的模式

r:只读模式

w:只写模式

a:只追加写模式

+:r+,w+,a+

代码介绍

01文件基本操作

1打开文件

#windows路径分隔符问题

open('c:\a.txt\nb\c\d.txt')  #这种情况路径字符串中存在转义字符,可能导致识别出错

#解决方案一:

open(r'c:\a.txt\nb\c\d.txt')  #r表示原生字符

#解决方案二:

oprn('c:/a.txt/nb/c/d.txt')

2绝对路径与相对路径问题

Windows下有两种访问路径的方式
1绝对路径 优点:绝对能找到
缺点:太冗长
2相对路径 简单

f=open(r'a.txt',mode='rt',encoding='utf-8)   #f的值是一种变量,占用的是 应用程序的内存空间

print(f)   #结果<_io.TextIOWrapper name='a.txt' mode='rt' encoding='utf-8'>

#操作文件:读写文件,应用程序对文件的读写请求都是在向操作系统发送

#系统调用,然后由操作系统控制硬盘把输入读入内存,或者写入硬盘

res=f.read()

print(res)      #结果:哎呀(我的a.txt文件内存的内容)

print(type(res))      #结果:<class 'str'>

2关闭文件

f.close()   #回收操作系统资源,操作系统能够打开的文件数是一定的,他会回收这个资源,但是他不知道什么时候回收,他就扫描你的文件,这样会增加负荷

print(f)     #结果:<_io.TextIOWrapper name='a.txt' mode='rt' encoding='utf-8'>

f.read()    #此时变量f存在,但是不能再读了

del f     #此时是回收应用程序的资源,解除与变量之间的绑定,要注意先后顺序,不能先删变量然后回收操作系统资源

02:with上下文管理

with open(r'a.txt',mode='rt',encoding='utf-8') as f:
res=f.read()
print(res)
print(type(res))
#等同于f=open(r'a.txt',mode='rt',encoding='utf-8')
#没有执行f.close,因为with帮你执行好了,这就叫自动管理

with open(r'a.txt',mode='rt',encoding='utf-8') as f1,\
open(r'b.txt',mode='rt',encoding='utf-8')as f2:
res1=f1.read()
res2=f2.read()
print(res1)
print(res2)
#打开多个文件

03:指定字符编码

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

t文本(默认的模式)
1、读写都以str(unicode)为单位的
2、只针对文本文件
3、必须指定encoding='utf-8'

'''
#没有指定encoding参数操作系统会使用自己的默认编码
#Linux系统默认utf-8
#Windows系统默认gbk
with open(r'a.txt',mode='rt',encoding='utf-8')
res=f.read() #t模式会将f.read()的结果解码成Unicode,最终你才看到这个结果哈哈
print(res,type(res))
#内存:utf-8格式的二进制-----解码-----》unicode
# 硬盘(a.txt内容:utf-8格式的二进制)

04:文件操作模式详解

# 以t模式为基础进行内存操作

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

with open(r'c.txt',mode='rt',encoding='utf-8') as f:
print('第一次读'.center(50,"*"))
res=f.read() #如果你没有指定的话,把所有内容一次性从硬盘读入内存,有缺陷的,如果文件过大(1T),将会把内存干爆
print(res)
print('第二次读'.center(50,"*")) #读的同时指针会移到最后,后面就没有内容了你读不出来的啦
res=f.read()
print(res)
#结果:(c.txt文件中存储的是:yanjialuo)

***********************第一次读***********************
yanjialuo
***********************第二次读***********************

 

with open(r'c.txt',mode='rt',encoding='utf-8') as f:  #这样两次都能读出来,因为重新打开一次文件,指针会移动到开头位置
print('第一次读'.center(50,"*"))
res=f.read()
print(res)
with open(r'c.txt',mode='rt',encoding='utf-8') as f:
print('第二次读'.center(50,"*"))
res=f.read()
print(res)
#结果:

***********************第一次读***********************
yanjialuo
***********************第二次读***********************
yanjialuo

 

#简单的案例,登录测试案例

 

# ===============案例==================
# 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 直接用line.split(':')话他会保存\n对比会错
# username,password=line.strip().split(':')
# if inp_username == username and inp_password == password:
# print('login successfull')
# break
# else: #for循环正常结束并且没有被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工具

# 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 name>>: ')
# with open('db.txt',mode='at',encoding='utf-8') as f:
# f.write('{}:{}\n'.format(name,pwd))

 

# 了解:+不能单独使用,必须配合r、w、a
# with open('g.txt',mode='rt+',encoding='utf-8') as f:
# # print(f.read())
# f.write('中国') 原先单纯的r模式不会写,r+会写,打开的时候指针是在开头的,这里是会覆盖写的

# 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()) #当前位置在最后还是读不出来
 
posted @ 2021-01-25 14:59  欢喜悲  阅读(115)  评论(0)    收藏  举报