老男孩python全栈day8

文件操作

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

编码方式:utf-8  gbk......

操作方式:只读,只写,追加,读写,写读。。。  以什么编码方式打开文件,就以什么编码方式进行操作

只读:

r

f = open('d:\模特主妇护士班主任.txt',mode='r',encoding='UTF-8')
content = f.read()
print(content,type(content))  #str
f.close()

rb    bytes类型 用于非文字的文件

f = open('模特主妇护士班主任',mode='rb',)   #默认encoding方式
content = f.read()
print(content)
f.close()  

只写:

w   如果没有此文件,创建;如果有此文件,覆盖原文件写入

f = open('log',mode='w',encoding='utf-8')
f.write('骑兵步兵')
f.close() 

wb

f = open('log',mode='wb')  #打开默认bytes
f.write('附近看到类似纠纷'.encode('utf-8'))  #写入必须加编码方式
f.close()

 

追加:

a   在原文件光标出追加

f = open('log',mode='a',encoding='utf-8')
f.write('佳琪')
f.close()

ab

f = open('log',mode='ab')
f.write('佳琪'.encode('utf-8'))
f.close()

  

读写:

r+  (最最常用)

# 先读后写 
f = open('log',mode='r+',encoding='utf-8')
print(f.read())
f.write('大猛,小孟')  #在原文件后面继续写入
f.close()

# 先写后读
f = open('log',mode='r+',encoding='utf-8')
f.write('大猛,小孟')  #原文件内容从第一个位置开始覆盖,覆盖的长度为写入的长度
print(f.read())   #显示的是未覆盖的内容
f.close()

  

r+b

f = open('log',mode='r+b')
print(f.read())
f.write('大猛,小孟'.encode('utf-8'))  #这里注意就好
f.close()

写读:

w+

f = open('log',mode='w+',encoding='utf-8')  #先创建文件
f.write('aaa')
f.seek(0)  ##必须加入此操作,不然读不出来,#调节光标 从某个字节处开始读
print(f.read())
f.close()

w+b 不再赘述

功能详解

obj = open('log',mode='r+',encoding='utf-8')
content = f.read(3)  # 读出来的都是字符 读三个字符
f.seek(3)  # 按照字节设置光标的位置  光标在3个字节处  一个中文3个字节
f.tell() 告诉你光标的位置
print(f.tell())

f.readable()  # 是否刻度
line = f.readline()  # 一行一行的读
line = f.readlines()  # 每一行当成列表中的一个元素,添加到list中
f.truncate(4)   #截取前4个字符 覆盖文件 其实就是除了前4个字符,删除后面的
for line in f:
    print(line)  #按行打印,会将回车\n也打印进去
f.close()

## 一下的功能是读取指定位置的字符
f = open('log',mode='a+',encoding='utf-8')
f.write('佳琪')
count = f.tell()  #光标的位置
f.seek(count-9)   #将光标设为倒数三个字前(三个字节代表一个汉字)
print(f.read(2))  #从光标处开始读两个字符 也就是读两个汉字
f.close()
## with可以打开多个文件
with open('log',mode='r+',encoding='utf-8') as f,\ 
    open('log',mode='w+',encoding='utf-8') as f1:

 

open()默认读取方式是r,默认编码方式是跟操作系统相匹配,一般是gbk

 

读的方式:

read 一次性读 

readlines 一次性读,按行切分

readline 一行一行读,但是不知道在哪儿结束,视频 图片 rb bytes 按照字节读

for循环 —— 最好了!!!  for line in f:

 

光标 —— 文件指针
seek -- 指定光标移动到某个位置
tell -- 获取光标当前的位置
truncate -- 截取文件

 

实践:

修改文件:读一个、写一个、删一个、重命名

# 修改文件
with open('小护士班主任',encoding='utf-8') as f,open('小护士班主任.bak','w',encoding='utf-8') as f2:
    for line in f:
        if '星儿' in line:  #班主任:星儿
            line = line.replace('星儿','啊娇')
        #写文件
        f2.write(line) #小护士:金老板

import os  ###
os.remove('小护士班主任') #删除文件
os.rename('小护士班主任.bak','小护士班主任')  #重命名文件

  

简单的注册、登陆

username = input('请输入你要注册的用户名:')
password = input('请输入你要注册的密码:')
with open('list_of_info',mode='w',encoding='utf-8') as f:
    f.write('{}\n{}'.format(username,password))  ### 注意这里,以两行的形式写入文件
print('恭喜您,注册成功')
lis = []
i = 0
while i < 3:
    usn = input('请输入你的用户名:')
    pwd = input('请输入你的密码:')
    with open('list_of_info',mode='r+',encoding='utf-8') as f1:
        for line in f1:
            lis.append(line)
    if usn == lis[0].strip() and pwd == lis[1].strip():  ### 读出来的会有回车  strip()将其去掉
        print('登录成功')
        break
    else:print('账号和密码错误')
    i+=1

  

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄