第九天

文件处理

什么是文件

操作系统提供的虚拟的概念,存储信息(用二进制存)

操作文件流程

  1. 打开文件

    f = open(r'文件路径','文件打开模式',encoding = '字符编码') # r 的作用是让文件路径里的/无效化,只是当作字符处理

    f = (r'D:python文件处理	est.txt','r',encoding = utf8) # 如果没有这个r 文件路径中的	就会被当作缩进,使文件路径失效
    
  2. 修改文件

  3. 保存文件

  4. 关闭文件

文件打开的三种模式

只读

r :读取 read的缩写,读取文本的内容,只读

f.read() 读取文件全部内容

f = (r'D:python文件处理	est.txt','r',encoding = utf8) 
f.read()

f.readline() 一行一行的读

f = (r'D:python文件处理	est.txt','r',encoding = utf8) 
f.readline() 

f.readlines() 读取所有行放入列表,把所有行都要拿出来,不能分段处理

f = (r'D:python文件处理	est.txt','r',encoding = utf8) 
f.readline() 

对于 逐行读取而言完全可以用for循环

for i in f.read:
     print(i)# 循环每一个字符
for i in f:
     print(i)# 循环每一行

文本读一行少一行,每一行末尾默认有一个换行

for i in f: 
    print(i)
print('f.readline():',f.readline())

清空后写入

w:write 只写(清空后写入),不可读

f = (r'D:python文件处理	est.txt','r',encoding = utf8) 
f.write()

f. writelines() 自动拼接列表元素,一行写入

print(f. writelines(['abc','def']) ) # abcdef

追加写入

a: 只写入(追加写入)不可读

*w和a模式可以自动创建文件

打开文件的两种方式

t—–>打开文本文件

b—–>打开二进制文件,一般用于图片/音频/视频的保存

这两个东西一般单独使用,一般与r/a/w连用

绝对路径和相对路径

绝对路径:

从盘符开始如D:python文件处理 est.txt

相对路径:

执行文件(当前运行文件)的文件夹下面的文件名,执行文件和打开文件同属于一个文件夹

未来写项目的时候尽量使用相对路径,一般都是再Windows上写代码,再部署到Linux系统上,相对路径不容易丢失

with管理文件上下文

为了方便使用,with提供了关闭文件的方式

with open(r'D:python文件处理	est.txt','r',encoding = utf8)as f:
	print(f.read())
   

with 打开文件下面会有个缩进,对文件的操作要写再缩进里,在这个缩进下文件不会关闭

with 关闭文件并不会解除文件在python中的内存占用,只会关闭操作系统中的文件,还是可以通过变量名打印出来它的类型

with open(r'D:python文件处理	est.txt','r',encoding = utf8)as f:
	print(f.read())
print(f) # <_io.TextIOWrapper name='test.txt' mode='r' encoding='utf8'>

文件的高级应用

仅作了解,因为并不会用到

r+

可读可写

光标在文件的头部,写入会覆盖后面的字符

w+

w+ 和w 并有什么区别

a+

可读可写

a模式默认光标在文件尾

通过对以上三种方式的了解,如果有可读可写的需求,可以用两种方式打开两次文件

光标的高级应用

8个进制位为一个字节,3个8进制位组成一个字符(针对中文,英文是一个字节一个字符)

(00000000-->一个字节 00000000 00000000) --> 一个字符,对应三个字节,对应一个中文 --> utf8

三种移动光标的位置(以字节为单位)

seek

with open('test.py', 'rb') as fr:
    fr.seek(5)  # 移动了3个字节,一个中文,默认从开头开始
    print(fr.read())
    print(fr.read().decode('utf8'))

whence

0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾

 fr.seek(3, 0)  # 0从开头
    # print(fr.read().decode('utf8'))
    fr.seek(3, 1)
    print(fr.read().decode('utf8'))
    fr.seek(0, 2)
    print(fr.read())

tell

告诉你当前光标位置

with open('test.py', 'rb') as fr:
    fr.seek(3, 0)
    print(fr.tell())

truncate: 截断

with open('test.py', 'ab') as fa:
    fa.truncate(2)

文件的修改

文件没有修改一说,只能覆盖

缓存文件的原理

# 同时打开多个文件
with open('test.py', 'r', encoding='utf8') as fr, 
        open('test_swap.py', 'w', encoding='utf8') as fw:
    data = fr.read()
    data = data.replace('sb', '傻逼')
    fw.write(data)
    
    

import os

os.remove('test.py')
os.rename('test_swap.py', 'test.py')
with open('test.py', 'r', encoding='utf8') as fr, 
        open('test_swap.py', 'w', encoding='utf8') as fw:
    # 再大的文件都能修改
    for i in fr:
        s = '傻逼'
        i = i.replace('sb', s)
        fw.write(i)

简单的登录注册

# 注册
print('注册功能')
count = 0  
while count < 3:
    username_inp = input('请输入你的用户名:')
    pwd_inp = input('请输入你的密码:')
    re_pwd_inp = input('请再次输入你的密码:')

    if not pwd_inp == re_pwd_inp: 
        print('密码不一致')
        count += 1
        continue
    with open(f'user_info.txt', 'a', encoding='utf8') as fa: # 将用户名密码保存到文件里
        fa.write(f'{username_inp}:{pwd_inp}
')
        fa.flush()  # 刷新,先保存再运行
        break
# 登录

print('登录功能')
username_inp = input('请输入你的用户名:')
pwd_inp = input('请输入你的密码:')
with open(f'user_info.txt', 'r', encoding='utf8') as fr:  # 取出文件里的用户名密码进行比较
    for user_info in fr:
        username, pwd = user_info.split(':')
        if username.strip() == username_inp and pwd.strip() == pwd_inp:
            print('登陆成功')
            break
    else:
        print('登录失败')

原文地址:https://www.cnblogs.com/lyyblog0715/p/11545051.html