Python-文件

目录

一、文件

二、Python-转义字符

三、防止字符被转义

四、打开操作关闭文件

五、with 语法

六、t\b

(1) rt

1)单账户登录优化案例

2)存多账户密码登录优化案例

(2)wt

(3)at

七、文件拷贝

八、+模式

九、修改文件


一、文件

# 一、控制文件读写操作模式
'''
    r:只读模式
    w:只写模式
    a:只追加模式,再原内容后补加内容
    +:r+,w+,a+;这三种均可读可写  (+ 不可单独使用)
'''
# 二、控制文件读写内容的模式(不可单独使用)
'''
    t模式:(默认格式)文本文件
        读写都是以字符串(Unicode)为单位
        需要给open指定参数encoding = 'utf -8'
    b模式:bytes模式/二进制模式
'''

二、Python-转义字符

* 需要在字符中使用特殊字符时,Python 用反斜杠 \ 转义字符。
1、续行符:\【当一行写不下,再结尾输入反斜杠】

# 1、续行符:\
python
print("line1 \
line2 \
line3")

# 2、反斜杠:\\
print(f'反斜杠','\\')

# 3、单引号
print(f'单引号','\'')

# 4、双引号
print(f'双引号',"\"")

# 5、响铃 \a
print("\a")# 执行后电脑有响声。
# (windows平台上pycharm终端不会响,要用cmd终端或者pycharm的Terminal终端)

# 6、退格(Backspace):\b
print(f'退格',"Hello \b World!")
print(f'正常',"Hello World!")

# 7、空:\000
print(f'空',"\000") # 在不同终端效果不同

# 8、换行 \n
print(f'换行','哈哈\n哈哈')

# 9、纵向制表符:\v
print(f'纵向制表符','Hello \v World!') # 在不同终端效果不同

# 10、横向制表符:\t
print(f'横向制表符','Hello \t World!')
print(f'正常--正常',"Hello World!")

# 11、回车:\r
print(f'回车',"Hello\rWorld!")
print(f'回车','google runoob taobao\r123456')# 将\r后面的内容移到字符串开头,并逐一替换开头部分的字符,直至将\r后面的内容完全替换完成。
print(f'回车',"Hello World!\r")

# 12、换页:\f
print(f'换页',"Hello \f World!") # 在不同终端效果不同

运行结果:

ine1 line2 line3

C:\Users\ZhangXinQi\AppData\Local\Programs\Python\Python310\python.exe D:\__TC22008_VBF\FOTA-vFlash-AutoTest\demo.py 
反斜杠 \
单引号 '
双引号 "

退格 Hello World!
正常 Hello World!
空  
换行 哈哈
哈哈
纵向制表符 Hello  World!
横向制表符 Hello      World!
正常--正常 Hello World!
World!
123456
回车 Hello World!
换页 Hello  World!

三、防止字符被转义

* 最后一个为绝对路径

四、打开操作关闭文件

# 1、打开文件
f = open('a.txt',mode='rt',encoding='utf-8')

# 2、操作文件 (读 写)
res = f.read()
print(res)

# 3、关闭文件
f.close()

五、with 语法

# with语法 (上下文管理器)
with open('a.txt', encoding='utf-8') as f:
    res = f.read()
    print(res)

# with语法,可以打开多个文件
with open('a.txt', encoding='utf-8') as f, \
        open('b.txt', encoding='utf-8') as f2: # \表示换行
    print(f.read())
    print(f2.read())

六、t\b

'''
     t模式:(默认格式)文本文件
        读写都是以字符串(Unicode)为单位
        需要给open指定参数encoding = 'utf -8'
   b模式:bytes模式/二进制模式
'''

(1) rt

with open('a.txt',mode='rt',encoding='utf-8') as f:
    print('第一次读'.center(80,'-'))
    print(f.read()) # f.read() 文件指针是从头指向尾

    print('第二次读'.center(80,'-'))
    print(f.read()) # 在第二次读取的时候,文件指针此时是在文件的尾部,该次读取应为空
运行结果:

--------------------------------------第一次读--------------------------------------
老大,老大,老大是不需要输入密码的
--------------------------------------第二次读--------------------------------------

实例:

前提:----之前表示账号,----之后表示密码

# 初步写法
username ='123456'
password = '123'
input_username = input('请输入账号:').strip() # strip 目的去掉空格
input_password = input('请输入M密码:').strip()
if input_username ==username and input_password ==password:
    print('登录成功')
else:
    print('账号或密码输入错误,请滚蛋')

1)单账户登录优化案例

# 登录案例优化
input_username = input('请输入账号:').strip() # strip 目的去掉空格
input_password = input('请输入M密码:').strip()
with open('user.txt', mode='rt', encoding='utf-8') as f:
    res = f.read()
    username, password = res.split('----')  # 将账号和密码拆分出来
    # print(res)
    # print(username)
    # print(password)

if input_username ==username and input_password ==password:
    print('登录成功')
else:
    print('账号或密码输入错误,请滚蛋')

运行结果:

请输入账号:123456
请输入M密码:123
账号或密码输入错误,请滚蛋

2)存多账户密码登录优化案例

前提:

# 多账户登录
input_username = input('请输入账号:').strip()  # strip 目的去掉空白字符
input_password = input('请输入M密码:').strip()
with open('user.txt', mode='rt', encoding='utf-8') as f:
    # 对多账户的处理
    for line in f:
        # print(line,end='') # txt 文档中,每行后面有换行符,print自己也加换行符;可以在print加上end='',消灭一个换行符
        # 上面加end只去掉了print自带的换行符
        # 现在要去掉txt文档里的换行符
        line = line.strip('\n')  # strip 去除字符串两端的’‘,默认去掉字符串两端的空白符号
        username, password = line.split('----')
        print(username, password)

        if input_username == username and input_password == password:
            print('恭喜登录成功')
            break  # r如果不加break,在第一次登录成功后,for依旧在循环
        '''
        else:
            print('账号或密码输入错误,请滚蛋') # 如果这样写,每循环一行,均告诉输入错误
        '''
    # for 循环+ else,else模块会在for循环正常结束的情况下执行,如果for循环break,则不执行else模块
    else:
        print('账号或密码错误,bye bye')

运行结果:

请输入账号:fly
请输入M密码:222
d123456 123
fly 222
恭喜登录成功

(2)wt

注:

# 如果在文件路径下,文件不存在,会创建一个文件,文件指针也是指向开始的位置
# 若文件路径下包含文件且含有内容,会清空文件内容,文件指针指向开始的位置
with open('c.txt',mode='w',encoding='utf-8') as f:
    f.write('野心是什么,褒义词或贬义词')
    f.write('晓看天色暮看云\n') # 加上换行符,指针会指向下一行
    f.write('行也思君坐也思君\n')  

(3)at

注:

# 如果在文件路径下,文件不存在,会创建一个文件,文件指针也是指向开始的位置
# 若文件且包含内容,会在文件内容后追加内容
# line 分行是通过\n\r换行符来识别行数
with open('d.txt',mode='a',encoding='utf-8') as f:
    f.write('低调\n')
    f.write('向前一小步,进步一大步')

注册:【该代码有点问题】

(1)用户名均为数字或字母,密码均为数字

(2)文件已含有的用户名,不可注册

(3)下图为use.txt

username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()

i = 0 # 增加计数器
# print(username.isalnum()) # 判断所有字符是否都是数字或者字母
# print(password.isdigit()) # 判断所有字符是否都是数字

# 数文件的行数
with open('user.txt', mode='r') as f:
    for line in f:
        i += 1 # 每循环一次,计数器加一

if username.isalnum() and password.isdigit():  # 判断用户名和密码是否合法
    with (open('user.txt', mode='r', encoding='utf-8') as f):
        # 判断user.txt是否已存在该用户名
        for line in f:
            username_inner, password_inner = line.strip('\n').split('----')
            line = line.strip('\n').split('----')
            print(username_inner, password_inner)
            if username in username_inner:

                if username_inner == username and password_inner == password:
                    print('登陆成功,欢迎您!')
                    break
                elif username_inner == username and password_inner != password:
                    print('密码输入错误,请重新登录!')
                    break
            else: # 用户名均未匹配,计数器-1
                i-=1
    if i ==0 : # for循环完成后,计数器为0
        with open('user.txt', mode='a', encoding='utf-8') as f:
            f.write(f'{username}----{password}\n')  # 这里用到格式化字符串
        print('恭喜你,注册成功,yep')
else:
    print('您的用户名或密码格式不正确,请重新输入,PLEASE')

运行结果:

请输入用户名:jerry
请输入密码:109
d123456 123
fly 222
jay 333
andy 444
jerry 109
登陆成功,欢迎您!

七、文件拷贝

# 拷贝
old_path = input('请输入原文件路径:')
nwe_path = input('请输入新文件路径:')
with open(fr'{old_path}',mode='rt',encoding='utf-8') as f1,\
    open(fr'{nwe_path}',mode='wt',encoding='utf-8') as f2: # f 用格式符,r防止被\转义
    res1 = f1.read()
    f2.write(res1)

请输入原文件路径:D:\__TC22008_VBF\FOTA-vFlash-AutoTest\user.txt
请输入新文件路径:D:\__TC22008_VBF\FOTA-vFlash-AutoTest\user(拷贝).txt

八、+模式

# r+:可读可写,以r为主,若文件不存在,会报错
# w+:可读可写,以w为主,若文件不存在,创建文件,若文件存在,清空文件
# a+:同理
# x:文件不存在,创建文件,文件存在,报错
with open('a.txt',mode='x',encoding='utf-8') as f:
with open('a.txt',mode='w+t',encoding='utf-8') as f:
with open('d.txt',mode='r+t',encoding='utf-8') as f:
    f.write('前面写入') # 文件指针指向第一个,将开头的覆盖掉
    res = f.read()
    print(res)
    f.write('r+,也可以写呀')  # read之后,文件指针指向最后,在末尾写入


readline,一次读一行;readlines,一次读很多行

writelines:

with open('data.txt',mode='wt',encoding='utf-8') as f:
    f.writelines(['avc','drf','222'])
    f.writelines(['avc\n', 'drf\n', '222\n'])

九、修改文件

第一种方式:文本编辑器修改文件的方式

# r+模式,文件指针在开头,a模式,文件指针在末尾
with open('data.txt',mode='rt',encoding='utf-8') as f:
    res =f.read()
    print(res)
    l =list(res) # 将其转为列表
    l.insert(3,'我是插入的')
    print(l)
    # 再将列表转回为字符串
    new_res = ''.join(l)
    print(new_res)

    # 第二种方法
    rep_res = res.replace('222avc','我是最新插入的')
    print(rep_res)

with open('data.txt',mode='wt',encoding='utf-8') as f:
    f.write(rep_res)

join的用法:

第二种方式:

# 第二种 修改文件
with open('a.txt',mode='rt',encoding='utf-8') as f,\
    open('a.txt.swap',mode='wt',encoding='utf-8') as f1:
    for line in f:
        res = line.replace('老大','老大永远不能被替换')
        f1.write(res)

# 删掉原文件,a.txt.swap修改文件名
import os
os.remove('D:\__TC22008_VBF\FOTA-vFlash-AutoTest\a.txt') #删除原文件
os.rename('D:\__TC22008_VBF\FOTA-vFlash-AutoTest\a.txt.swap','D:\__TC22008_VBF\FOTA-vFlash-AutoTest\a.txt')

走的再慢的人,只要他不丧失目标,也比漫无目的地徘徊的人走的快!


  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值