字符编码和Python代码操作文件

读写模式之a模式

# a模式  只追加模式
# 路径不存在:自动创建
with open(r'a.txt','a',encoding='utf8') as f:
pass
# 路径存在:不会清空文件 在文件末尾添加内容
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write('\n今天周四了 马上又要放假了 好开心!') """
我们所学习的r w a读写模式都只能操作文本文件,其他模式需要用d模式
"""

文件操作方法

# 文件操作方法
# 1.读系列
with open(r'a.txt', 'r', encoding='utf8') as f:
# print(f.read()) # 一次性读取文件内所有的内容
# print(f.readline()) # 每次只读文件一行内容
# print(f.readlines()) # 读取文件所有的内容 组织成列表 每个元素是文件的每行内容
# print(f.readable()) # 判断当前文件是否具备读的能力 # 2.写系列
with open(r'a.txt','w',encoding='utf8') as f:
# f.write('克服一切困难 奥利给!') # 往文件内写入文本内容
# f.write(123) # 写入的内容必须是字符串类型
# f.writelines(['jason','kevin','tony']) # 可以将列表中多个字符串元素全部写入
# print(f.writable()) # True
# print(f.readable()) # False
f.flush() # 直接将内存内文件数据刷到硬盘 相当于ctrl+s

文件优化操作

with open(r'a.txt', 'r', encoding='utf8') as f:
# print(f.read()) # 一次性读取文件内所有的内容
# print(f.read()) # 一次性读取文件内所有的内容
# print(f.read()) # 一次性读取文件内所有的内容
"""
1.一次性读完之后 光标停留在了文件末尾 无法再次读取内容
2.该方法在读取大文件的时候 可能会造成内存溢出的情况
解决上述问题的策略就是逐行读取文件内容
"""
# for line in f: # 文件变量名f支持for循环 相当于一行行读取文件内容
# line
'''以后涉及到多行文件内容的情况一般都是采用for循环读取'''

课堂练习

1.简易版本的注册、登陆功能
普通要求(实现一次即可)
注册功能
获取用户名和密码组织成你喜欢的样子写入文件即可
登陆功能
获取用户名和密码然后比对是否与文件内用户数据一致 # 注册功能
# 1.获取用户用户名和密码
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 2.将用户名和密码组织成一个字符串
data = '%s|%s' % (username, password)
# 3.文件操作 写入数据
with open(r'userinfo.txt', 'w', encoding='utf8') as f:
f.write(data)
print('用户:%s 注册成功' % username) # 登录功能
# 1.获取用户名和密码(先使用input获取用户输入的数据 然后strip()移除首尾空格 之后赋值给变量名username)
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 2.获取文件内真实的用户数据
with open(r'userinfo.txt','r',encoding='utf8') as f:
# 由于现在文件中只有一行内容 我们干脆直接读取完
data = f.read() # 'jason|jason123'
'''with子代码执行完之后的结果是可以在外面使用的'''
# 3.切割字符串获取真实的用户名和密码
res = data.split('|') # ['jason', 'jason123']
'''这里也可以直接使用解压赋值的操作 real_name,real_pwd = data.split('|')'''
# 4.比对数据
if username == res[0] and password == res[1]:
print('登录成功')
else:
print('用户名或密码错误')

进阶练习

# 多用户注册
# while True:
# # 1.获取用户用户名和密码
# username = input('username>>>:').strip()
# password = input('password>>>:').strip()
# # 2.将用户名和密码组织成一个字符串
# data = '%s|%s\n' % (username, password)
# # 2.1.判断用户名是否已存在
# with open(r'userinfo.txt', 'r', encoding='utf8') as f1:
# # 2.2.循环读取每一行用户数据
# for line in f1:
# # 2.3.获取每一行数据中的用户名
# real_name, real_pwd = line.split('|')
# # 2.4.判断用户名是否一致
# if username == real_name:
# print('用户名已存在')
# break
# else:
# # 3.文件操作 写入数据
# with open(r'userinfo.txt', 'a', encoding='utf8') as f:
# f.write(data)
# print('用户:%s 注册成功' % username) # 多用户登录
# 1.获取用户名和密码(先使用input获取用户输入的数据 然后strip()移除首尾空格 之后赋值给变量名username)
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 2.获取文件内真实的用户数据
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
# 3.切割字符串获取真实的用户名和密码
'''注意密码末尾有\n'''
real_name, real_pwd = line.split('|') # ['jason', 'jason123\n']
# 4.比对用户名和密码是否正确
if username == real_name and password == real_pwd.strip('\n'):
print('登录成功')
break
else:
print('用户名或密码错误')

代码整合

while True:
print("""
1.用户注册
2.用户登录
""")
choice = input('请输入您想要执行的功能编号>>>:').strip()
if choice == '1':
# 1.获取用户用户名和密码
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 2.将用户名和密码组织成一个字符串
data = '%s|%s\n' % (username, password)
# 2.1.判断用户名是否已存在
with open(r'userinfo.txt', 'r', encoding='utf8') as f1:
# 2.2.循环读取每一行用户数据
for line in f1:
# 2.3.获取每一行数据中的用户名
real_name, real_pwd = line.split('|')
# 2.4.判断用户名是否一致
if username == real_name:
print('用户名已存在')
break
else:
# 3.文件操作 写入数据
with open(r'userinfo.txt', 'a', encoding='utf8') as f:
f.write(data)
print('用户:%s 注册成功' % username)
elif choice == '2':
# 1.获取用户名和密码(先使用input获取用户输入的数据 然后strip()移除首尾空格 之后赋值给变量名username)
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 2.获取文件内真实的用户数据
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
# 3.切割字符串获取真实的用户名和密码
'''注意密码末尾有\n'''
real_name, real_pwd = line.split('|') # ['jason', 'jason123\n']
# 4.比对用户名和密码是否正确
if username == real_name and password == real_pwd.strip('\n'):
print('登录成功')
break
else:
print('用户名或密码错误')
else:
print('没有改功能 爱咋滴咋滴!')

文件操作模式

t	文本模式
1.默认的模式
r w a >>> rt wt at
2.该模式所有操作都是以字符串基本单位(文本)
3.该模式必须要指定encoding参数
4.该模式只能操作文本文件 b 二进制模式
1.该模式可以操作任意类型的文件
2.该模式所有操作都是以bytes类型(二进制)基本单位
3.该模式不需要指定encoding参数
rb wb ab

二进制模式读写操作

# with open(r'a.txt','rb') as f:
# # print(f.read())
# print(f.read(6).decode('utf8')) # with open(r'a.txt','r',encoding='utf8') as f:
# print(f.read())
# print(f.read(4)) """
read() 括号内可以放数字
在t模式下表示字符个数
在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示
"""

文件内光标的移动

with open(r'b.txt', 'rb') as f:
print(f.read(4).decode('utf8'))
print(f.tell()) # 查看光标移动了多少个字节
f.seek(3, 1)
print(f.read().decode('utf8'))
"""
控制文件内光标的移动 f.seek()
f.seek(offset,whence)
offset表示位移量
始终是以字节为最小单位
正数从左往右移动
负数从右往左移动
whence表示模式
0:以文件开头为参考系(支持tb两种模式)
1:只支持b模式 以当前位置为参考系
2:只支持b模式 以文件末尾为参考系
""" # 小练习:实现动态查看最新一条日志的效果
import time
with open('a.txt', 'rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
# 没有内容
time.sleep(0.5)
else:
print(line.decode('utf-8'), end='')

文件的内容修改

# 方式1 覆盖
with open(r'c.txt','r',encoding='utf8') as f:
data = f.read()
# print(type(data)) >>> str
with open(r'c.txt','w',encoding='utf8') as f1:
new_data = data.replace('tony','jason')
f1.write(new_data)
1.不适合修改量大的文件 # 方式2 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt') # 删除原文件
os.rename('c.txt.swap', 'c.txt') # 重命名文件
1.需要插入模块才能实现删除功能
2.多创建一个文件

小练习

员工管理系统思路

1.整理今日内容并完成博客编写
2.熟练掌握课堂练习
普通版本 必会
进阶版本与封装版本掌握越快越好
3.写一个简易的拷贝工具
支持所有的文件类型

答案(2)

1.循环打印系统中拥有的功能
2.获取用户输入的功能编号并判断是否在已有功能中
3.先在循环外定义存储用户数据的列表(用户数据放在列表元素用字典形式)
4.先获取用户的编号
5.循环获取列表中每个用户字典 判断用户编号是否存在
6.存在则提示用户并重新打印全部功能
7.如果不存在则获取用户其他数据并组织成一个字典
8.最后添加到用户列表
# 1.简易版本的注册、登陆功能
# 普通要求(实现一次即可)
# 注册功能
# 获取用户名和密码组织成你喜欢的样子写入文件即可
# 登陆功能
# 获取用户名和密码然后比对是否与文件内用户数据一致 print('''
\33[31m1.用户注册
\33[32m2.用户登录
\33[33m3.删除用户
\33[34m4.退出用户''') # 定义系统的几个功能
while True:
# 1. 注册功能,添加用户,首先获取用户创建的信息,然后存入数据库
# 1.1 获取用户创建的信息
choice = input('\033[35m选择功能编号:').strip()
if choice == '1':
print('\33[31m——————进入用户注册功能!——————')
login_username = input('\33[31m请输入注册用户名:').strip()
login_password = input('\33[31m请输入注册密码:').strip()
# 1.2 将数据整合到一起
login_msg = f'{login_username}|{login_password}\n'
# 1.3 判断输入的注册信息是否在数据库中,需要读取数据库中的 用户名
with open(r'login_date.txt', 'r', encoding='utf8') as f1:
for line in f1:
read_date_username, read_date_password = line.split('|')
if login_username == read_date_username: # 1.4 如果在数据库,那就不行
print('\33[36m该用户已存在,请更换用户名以继续!')
break
else:
# 1.5 不在数据库,就需要将数据写入数据库中
with open(r'login_date.txt', 'a', encoding='utf8') as f2:
f2.write(login_msg)
print(f'\33[36m用户{login_username}注册成功') elif choice == '2':
print('\33[32m——————进入用户登录功能!——————')
# 1. 获取用户输入的信息
inp_username = input('输入用户名:').strip()
inp_password = input('请输入密码:').strip()
login_msg1 = f'{inp_username}|{inp_password}'
# 2. 将数据库的信息读出来 跟用户输入的进行比对
with open(r'login_date.txt', 'r', encoding='utf8') as f3: # 读信息
for line in f3: # 把数据库内的数据一行一行的循环比对
read_date_username1, read_date_password1 = line.split('|')
if inp_username == read_date_username1:
print(f'\33[32m用户{read_date_username1}登录成功!')
break
else:
print('\33[31m未查询到此用户,请进行注册!')
elif choice == '3':
print('\33[33m用户删除')
elif choice == '4':
print('\33[34m退出程序')
else:
print('你个憨皮,未开通此功能!')

答案(3)

3.写一个简易的拷贝工具   ( 支持所有的文件类型 )

source_file = input('输入源文件路径:').strip()
destination_file = input('输入目标文件路径:').strip()
with open(rf'{source_file}','rb') as f1,open(rf'{destination_file}','wb') as f2:
for line in f1:
res = f2.write(line)
print(res)

字符编码和Python代码操作文件的更多相关文章

  1. 字符编码和python中的文件处理

    字符编码与python文件处理 ---------------- 字符编码 1.常见的编码 ASCII: 美国人发明的,只编码英文字母和符号,1个字节. GB2312: 中国人发明的,增加了中文汉字和 ...

  2. 在Python中操作文件之truncate()方法的使用教程

    在Python中操作文件之truncate()方法的使用教程 这篇文章主要介绍了在Python中操作文件之truncate()方法的使用教程,是Python入门学习中的基础知识,需要的朋友可以参考下 ...

  3. day06 python代码操作MySQL

    day06 python代码操作MySQL 今日内容 python代码操作MySQL 基于python与MySQL实现用户注册登录 python操作MySQL python 胶水语言.调包侠(贬义词& ...

  4. 字符编码和python文件操作

    字符编码和文件操作 目录 字符编码和文件操作 1. 字符编码 1.1 什么是字符编码 1.2 字符编码的发展史 1.2.1 ASCII码 1.2.2 各国编码 1.2.3 Unicode 1.3 字符 ...

  5. python 关于操作文件的相关模块(os,sys,shutil,subprocess,configparser)

    一:os模块 os模块提供了许多允许你程序与操作系统直接交互的功能 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname&quo ...

  6. 字符编码codecs模块(读写文件)

    python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理.有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码, ...

  7. python关于操作文件的相关模块(os,sys,shutil,subprocess,configparser)

    一:os模块 os模块提供了许多允许你程序与操作系统直接交互的功能 功能 说明 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirna ...

  8. 字符编码和python使用encode,decode转换utf-8, gbk, gb2312

    ASCII码 标准ASCII码使用7位二进制数表示大写或小写字母,数字0到9标点符号以及在美式英语中使用的特殊控制字符. 在标准ASCII码中,最高位(b7)用作奇偶校验位,所谓奇偶校验,是指在代码传 ...

  9. 字符编码到python编辑器流程

    字符(存储了信息的东西)编码(): 键盘发送的是电流-->主机(内存)接受到电流(当作010100110101)-->显示屏 接受电流(当作010100110101------->键 ...

随机推荐

  1. python 面向对象:类属性

    一.概念和使用 类属性就是给类对象定义的属性 类属性用于记录与这个类相关的特征 类属性不会用于记录具体对象的特征 使用赋值语句在  class  关键字下方可以定义类属性 二.代码演示 示例需求: 定 ...

  2. linux7,一台物理机上使用VM装多个虚拟机,始终只有一个虚拟机网络正常,其他虚拟机报错Error: Connection activation failed: No suitable device found for this connection.

    今天在VM新装了一个虚拟机,结果发现原来的虚拟机连不上了,重启网络服务后报错 Error: Connection activation failed: No suitable device found ...

  3. python 迭代器链式处理数据

    pytorch.utils.data可兼容迭代数据训练处理,在dataloader中使用提高训练效率:借助迭代器避免内存溢出不足的现象.借助链式处理使得数据读取利用更高效(可类比操作系统的资源调控) ...

  4. 论文翻译:2021_AEC IN A NETSHELL: ON TARGET AND TOPOLOGY CHOICES FOR FCRN ACOUSTIC ECHO CANCELLATION

    论文地址:https://ieeexploreieee.53yu.com/abstract/document/9414715 Netshell 中的 AEC:关于 FCRN 声学回声消除的目标和拓扑选 ...

  5. 用jquery实现省市联动

    <!-- 需求: [1] 动态生成省份选择框. [2] 当选择了省份的某一项时, 动态改变 城市选择中的列表项. --> <!DOCTYPE html> <html la ...

  6. springBoot--原理分析

    起步依赖分析 分析spring-boot-starter-parent 按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-star ...

  7. 记一次线上SpringCloud-Feign请求服务超时异常排查

    由于近期线上单量暴涨,第三方反馈部分工单业务存在查询处理失败现象,经排查是当前系统通过FeignClient调用下游系统出现部分超时失败(异常代码贴在下方). Caused by: feign.Ret ...

  8. Vulnhub系列——持续更新

    vulnhub系列--持续更新 一 · XXE Lab: 1 ​ 使用vmware搭建靶机 ​ 扫描存活主机 ​ 找到目标主机--192.168.1.18 ​ 开始扫描目标端口 ​ 发现只开了一个80 ...

  9. 【记录一个问题】铁威马NAS,升级系统后,所有安装的配置项都丢失了

    因为铁威马的系统功能真的是弱,所以写了一些家庭照片处理的系统. 上上周升级了系统后,丢失了以下内容: anaconda 2.及其conda下python3环境的各种库 3.nginx的转发配置 铁威马 ...

  10. WebGPU图形编程(4):构建一个彩色的正方形<学习引自徐博士教程>

    本节我们来复原一个彩色的正方形,前提告知,本节的shaders和main的代码从结构上有调整,我会更加详细的描述每行的代码意思: 源代码下载地址:https://github.com/jack1232 ...