lchengshao

文件处理以及基本使用

  1. 文件的基本使用
    复制代码
    1. 我们能够操作那些类型文件:
      .txt 没有后缀的文件
      我们暂时不能操作 word, Excel,PPT等文件 numpy,pandas等模块可以操作

    2. 如何操作文件
      三个步骤
        1. 打开文件()
       2. 读或者写
    3. 关闭文件
    文件的路径分为两种:一种是 相对路径,一种是绝对路径
    'D:\Python27\day10\a.txt' (绝对路径)
       当前文件下 a.txt (相对路径)


      # open('要操作文件的路径','读写模式','字符编码(utf-8)')
    # 当路径中出现了字母和斜杠的组合会产生一些特殊的含义,所以我们应该去掉 文件路径开头加上 r
    步骤1:
       f= open(r'D:\Python27\day10\a.txt', 'r', encoding='utf-8')
    # 打开文件后 返回的是文件的句柄
    步骤2:
    print(f) # <_io.TextIOWrapper name='D:\\Python27\\day10\\a.txt' mode='r' encoding='utf-8'>
    print(f.read()) # 类似于文件的内置方法
    步骤3:
    f.close() # 关闭文件
      
    3. 第二种方法打开文件就比较简单了
    1. with上下文管理打开文件!
    2. as 起别名
    3. 特点在于能够 自动关闭文件。

      with open(r'a.txt','r',encoding='utf-8') as f:
       print(f.read())
    复制代码

     

  2.  文件的读写模式(只读,只写,只追加)
    复制代码

    """
    语法格式:
    open(文件路径,读写模式,字符编码)
    文件路径:是必须写的
    读写模式:也是必须写的
    字符编码:可选的
    """

    读写模式: r(只读:只能读,不能写)

            w (只写:不能读)

              a(在原来的基础之上添加新的内容)

    1. 只读模式 # 当文件不存在的时候 直接报错  

        with open('a.txt','r',encoding='utf-8') as f:

           print(f.read())

     

    2. 只写模式 # 当文件不存在的时候 会自动创建出来  如果有文件 里面有内容会被后面写进去的内容直接覆盖

      with open('a,txt','r',encoding='utf-8') as f:

          prinr(f.write)

    3. 追加模式:# 当文件不存在的时候 会自动创建出来 记住:它是追加写,而不是覆盖原来的内容!

      with open('c.txt', 'a', encoding='utf-8') as f:

          f.write('hello world')



    复制代码

     

  3.  文件读写操作的相关内置方法
    复制代码
    1. 读系列 相关方法
    with open('a.txt','r',encoding='utf-8') as f:
    print(f.read()) # read 方法是一次性读完全部内容 弊端:如果文件内容过大 会顶爆内存
    prinr(f.readline()) # readlline方法 一次只读文件的一行内容
    print(f.readlines()) # readlints 一次性一行一行读完文件的所有内容,然后每一个内容作为列表的一个元素返回,返回的数据类型是 列表
    print(readable()) # 判断文件是否可读 返回True或者 Fales

    2. 写系列
       with open('a.txt','w',encoding='utf-8') as f:
       print(f.write('写进去的文件内容')) # 写进去的文件内容 会覆盖前面的旧内容
    print(f.writeable()) # 判断是否可写
    
    
    复制代码

     

  4. 读取文件的优先操作
    复制代码

    with open('a.txt', 'r', encoding='utf-8') as f:
      # print(f.read()) # 一次性读取文件的所有数据,并且光标在文件的末尾,如果在去读,就读不到了
      # print(f.read())
    # 文件句柄f是支持for循环的
      for line in f:
    # line: 就是文件的一行内容
        print(line)
    # 了解的方法:
        # f.flush() # 把数据从内存中立刻刷到磁盘
    """




    复制代码

     

  5. 文件的操作模式
    复制代码
    1. 文本模式:

    """
      with open('userinfo.txt', 'r', encoding='utf-8') as f:
      文本模式默认就是操作字符串,文本
    特征:
      1. encoding参数必须指定
      2. 读取的所有的数据都是以字符串为单位的
      3. t模式只能够读取文本或者字符模式
    """

    2. 二进制模式:

          b模式:binary
          with open('userinfo.txt', 'rb') as f:
          """
            b模式中得b不能省略------------> rb wb ab
    特征:
        1. encoding='utf-8'参数不能够指定
        2. 读取的数据全部以字节为单位
        3. 二进制模式可以读取任意类型的文件
          """

    
    
    复制代码

     

  6.  练习题
    复制代码
    用户注册与登录功能
    while True:
    print(
    '1,注册功能'
    '2,登录功能'
    )
    cmd = input('请选择功能>>>:').strip()
    if cmd =='1':
    username = input('请输入账户>>>').strip()
    password = input('请输入密码>>>').strip()
    # 2 读取文件判断用户是否已经注册
    with open('a.txt','r',encoding='utf-8') as f:
    res = f.read().split(',')[0]
    for line in res:
    # 3. 进行字符分割
    # print(res)
    # 4 判断用户是否已经注册
    if username in res:
    print('该用户已经注册,请重新输入')
    break
    # 5 如果用户没有注册 则保存文件 注册成功
    else:
    data = '%s,%s\n' % (username,password)
    with open('a.txt','a',encoding='utf-8') as f:
    f.write(data)
    print('注册成功')
    if cmd == '2':
    username = input('请输入账号>>>:').strip()
    password = input('请输入密码>>>:').strip()
    with open('a.txt', 'r', encoding='utf-8') as f:
    # read readline
    # 循环逐行读取用户名和密码
    for line in f:
    # line : jerry|123
    real_username, real_password = line.split(',') # ['jerry', '123\n']
    # print(real_username, real_password)
    # 比较用户名和密码
    if real_username == username and password == real_password.strip('\n'):
    print('登录成功')
    break
    else:
    print('用户名或者密码不正确')
     
    复制代码

     简单的拷贝功能

    复制代码
    # 简易版本的拷贝功能
    # 请输入需要拷贝的地址
    while True:
        cp_name = input("输入拷贝后的地址>>>").strip()
        with open(cp_name,'r',encoding='utf-8') as f:
            data = f.read()
        
        # 输入需要拷贝后的地址
        cp_time = input("输入拷贝后的地址>>>").strip()
        with open(cp_time,'w',encoding='utf-8') as f1:
            f1.write(data)
            print('拷贝完成')
    复制代码

     

    7. 二进制模式下的读写操作

复制代码
默认情况下是t模式:

with open('a.txt', 'r', encoding='utf-8') as f:
   print(f.read(5))
"""
t模式下:
    f.read() 如果不指定参数,默认情况下是一次性读取完所有
    f.read(5) 如果指定了参数,返回的就是字符串的个数

"""

with open('a.txt', 'rb') as f:
    # print(f.read().decode('utf-8')) # b'helloworld'
    print(f.read(7).decode('utf-8')) # b'helloworld'
"""
b模式下:
    f.read(5) 如果指定了参数,返回的就是字节的个数
    如果文件中有中文字符,切记书写的数字要是3的倍数(因为一个中文字符是3个字节)如果有中文和英文 那就需要计算了
"""
复制代码

8. 控制文件光标的移动

复制代码
一共有三种模式:
    1. 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的: 它能够使用在t和b模式
    2.  该模式代表指针移动的字节数是以当前所在的位置为参照的: 只支持b模式,t模式不行
    3. 该模式代表指针移动的字节数是以文件末尾的位置为参照的 f.seek()
  4. 在问本模式下 移动的是字符的个数  在二进制模式下 移动的是字节的个数! 
 with open('a.txt', 'r', encoding='utf-8') as f:
     print(f.read(5)) # 你helloworld
     f.seek(3, 1)
     print(f.read())
    # 代表 从中间开始 在向右移动 3 个字符

with open('a.txt', 'rb') as f:
    print(f.read(2))  # helloworld
    f.seek(-3, 2)
    print(f.read())
        代表的是移动的偏移量
        如果是正数,就往右边移
        如果是负数,就往左边以----------》左边要可移动
    如果开头就向左移动 在左边没有字符或字节的情况下会报错的
            
复制代码

小练习 实现动态查看最新一条消息的结果

复制代码
import time

with open('access.log', mode='rb') as f:
    f.seek(0, 2)
    while True:
        line = f.readline()
        if len(line) == 0:
            # 没有内容
            time.sleep(0.5) # 睡眠0.5秒
        else:
            print(line.decode('utf-8'), end='')
复制代码

9. 修改文件

复制代码
mode='r+'    
mode='w+t'
mode='a+t'
# 可读可写
# 可读可写
# 可读可写

1. 硬盘中得数据是不允许直接修改的
2. 内存中得数据是可以直接修改的

'''方式一:'''
# 1. 读取文件内的所有数据
# 快捷键:shift+enter
with open('a.txt', 'r', encoding='utf-8') as f:
    data = f.read()
print(data)

# 2. 读取完字符之后,做字符替换
with open('a.txt', 'wt', encoding='utf-8') as f:
    f.write(data.replace('kevin', 'kevinSB'))


'''方式2:'''
import os

with open('a.txt',mode='rt',encoding='utf-8') as read_f, \
        open('.a.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
    for line in read_f:
        wrife_f.write(line.replace('SB','kevin'))

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
复制代码

 

posted on   Lubomierz  阅读(18)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人

导航

统计信息

点击右上角即可分享
微信分享提示