文件操作(重要)

文件操作

  • 将内存中的数据持久化保存到文件中

【一】打开文件的两种方式

【1】使用open语句
  • 三种模式: w:覆盖写 a:追加写 r:读

  • 参数(文件路径,打开文件的模式,编码格式)

(1)打开文件并付给句柄对象
fp = open('01.text', 'r', encoding='utf-8')
print(fp)           # <_io.TextIOWrapper name='01.text' mode='r' encoding='utf-8'>
(2)读取所有文件数据
data = fp.read()
(3)打印
print(data)
fp.close()      # 关闭文件
【2】with语句
  • 在with语句内部打开文件

 with open('01.text', 'r', encoding='utf-8') as fp:
    data = fp.read()
print(data)             # gdy|123

【二】文件的操作模式

【1】读 r
with open('01.text', 'r', encoding='utf8') as fp:
    data = fp.read()
user = data.split('|')
print(user)             # ['gdy', '123']
​
  • 已经学过字符串的格式化语法

    • f : 格式化输出

    • b : 将字符串转为二进制

    • r : 取消 \ 转义

    • print('a\\nb')      # a\nb
      print(r'a\nb')      # a\nb
    • # 加r和不加r的区别,不加r会出现乱码
      print(r'D:\Python\PythonProjects\PythonProjects29\day10\01.text')
      # D:\Python\PythonProjects\PythonProjects29\day10\01.text
      print('D:\Python\PythonProjects\PythonProjects29\day10\01.text')
      # D:\Python\PythonProjects\PythonProjects29\day10•.text
【2】覆盖写 w
  • 覆盖写

  • 文件名存在则打开,不存在则新建

  • 功能:打开当前文件并且将文件内容清空 然后写入新的内容

(1)一次性写入
data = 'opp|366'
with open(file='01.text', mode='w', encoding='utf8') as fp:
    # fp.write(写的内容)
    fp.write(data)
(2)连续写入
data = 'gdy|666'
with open(file='01.text', mode='w', encoding='utf8') as fp:
    fp.write(data)
    fp.write("666")
fp = open('01.text', 'w', encoding='utf-8')
# 打开文件开始写入
fp.write('aaa')
fp.write('bbb')
fp.write('ccc')
fp.write('ddd')
fp.close()
# 关闭文件以后无法再写入
# I/O operation on closed file. 文件已经关闭无法再继续操作
fp.write('9999')
​
# aaabbbcccddd
【3】追加写 a
  • 文件不存在则新建并写入

  • 文件存在则打开并继续写入

  • 不会自带换行功能

data = 'dream|666'
with open('01.text', 'a', encoding='utf8') as fp:
    fp.write(data + '\n')
    
# 每执行一次就增加一行dream|666

【三】文件操作模式补充

【1】文本编辑模式
  • w / a / r

  • 完整的模式应该是wt / at / rt

  • 大文本编辑模式

【2】二进制数据模式

wb / rb

with open('img.png', 'rb') as fp:
    data = fp.read()
with open('girl.jpg', 'wb') as fp:
    fp.write(data)

【四】文件操作扩展模式

r+ / w+ / a+

r : 只读

w : 只写无法读

with open('01.text', 'r+', encoding='utf-8') as fp:
    fp.write('666')
    # 写完以后需要进行持久化保存才能被读出来,否则是空的
    data = fp.read()
print(data)

【五】文件的操作方法详细

data = 'gdy|123'
with open('01.text', 'a', encoding='utf8') as fp:
    fp.write(data + '\n')           # 运行一次就会增加一行gdy|123
【1】r模式的方法详细
(1)一次性全部读完
with open('01.text', 'r', encoding='utf8') as fp:
    data = fp.read()
    print(data)
(2)每次只读一行
with open('01.text', 'r', encoding='utf8') as fp:
    count = 0
    while True:
        count += 1
        data = fp.readline()        # readline 逐行读取文件
        if data:
            print(count, data)
        else:
            break
(3)一次性读很多行,把所有数据读出来后放到一个列表中
with open('01.text', 'r', encoding='utf8') as fp:
    data = fp.readlines()       
    # .readlines([sizeint])  
    # 读取所有行并返回列表若给定sizeint>0则只读取第一行字符,且带‘\n’,也以列表格式输出
    print(data)             # ['gdy|123\n', 'gdy|123\n']
(4)测试当前对象是否可读
with open('01.text', 'r', encoding='utf8') as fp:
    print(fp.readable())            # True      readable()测试当前文件是否可读,返回布尔值
    fp = open('01.text', 'r', encoding='utf8')
    fp.close()
    print(fp.readable())            # 报错
【2】写模式的操作方法
(1)一次性写入新内容
with open('01.text', 'a', encoding='utf-8') as fp:
    fp.write('666')
    # 666
(2)逐个元素进行写入
data_list = ['111', '\n', '222','\n']
with open('01.text', 'a', encoding='utf-8') as fp:
    fp.writelines(data_list)
    
    # 111
    # 222

【六】控制文件内指针移动

with open('01.text', 'r', encoding='utf8') as fp:
    # read 可以放参数,参数是读取到哪个索引位置
    data = fp.read(8)   # 换行也算一个移动指针
print(data)         
# 999
# 111

【七】seek函数

  • 想要读取文件内指定位置的内容就需要seek函数(指针移动的字节数,模式控制):

  • 三种模式

    • 0:以文件开头作为参照

    • 1:以当前所在位置作为参照

    • 2:以文件末尾的位置作为参照

# 0模式
with open('01.text', 'rt', encoding='utf-8') as fp:
    fp.seek(6, 0)
    print(fp.tell())        # 6
    print(fp.read())        # 英文占一个字符,中文占三个字符
    # 从第6个字符向后读
# 1模式
with open('01.text', 'rb') as fp:
    # 英文占一个字节 (一个字符)
    # 中文占三个字节 (一个字符)
    print(fp.read())        
    # b'\xe5\x9b\xbd99\r\n\xe4\xbd\xa011\r\n\xe7\xac\xac22\r\n333\r\n444\r\n555' 
    fp.seek(3, 1)
    print(fp.tell())  # 37
    print(fp.read())  # b''
    fp.seek(3, 1)
    print(fp.tell())  # 40
    print(fp.read())  # b''
# 2模式
with open('01.text', 'rb') as fp:
    print(fp.read())
    fp.seek(0, 2)
    print(fp.tell())
    fp.seek(-4, 2)
    print(fp.read())
​

小练习

# 【一】登录
input_username = input(f"请输入账号:").strip()
input_password = input(f"请输入密码:").strip()
with open(r'01.text', mode='r', encoding='utf8') as f:
    for line in f:
        username, password = line.strip('\n').split(':')
        if username == input_username and password == input_password:
            print(f"登录成功")
            break
    else:
        print(f"账号密码输入错误")
        
# 【二】注册
username = input("请输入用户名:").strip()
password = input("请输入密码:").strip()
with open('02.text', 'a', encoding='utf-8') as f:
    info = '%s:%s\n' % (username, password)
    f.write(info)
  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值