1 2 3 4

文件的处理

文件的处理

1、什么是文件
    文件就是操作系统提供给应用程序来操作硬盘的虚拟的概念

2、为什么要用文件
    因为人类和计算机要永久保存数据

3、怎么用文件

  采用:open()
相对路径:a.txt  # 必须与当前py文件在同一级目录   #### 一般建议多用相对路径
绝对路径:D:\项目路径\python13期\day07\a.txt  本机保存的位置

"""

文件上下文:
f= open('文件路径','打开文件模式','指定支付的编码')

# f = open("a.txt")  用这个来用文件
#
# print(f.readable())  # 判断当前文件是否可读
# print(f.writable())  # 判断当前文件是否可写

以下记得添加
# # del f  # 回收变量资源
# f.close()  # 回收操作系统的资源
with 自动帮你回收操作系统的资源   del f  需要自己自己加上
# with open(r"my testing.py",mode = 'r',encoding= 'utf-8') as f:
#     # print(f.read())
#     # prinf = open("E:\PycharmProjects\study\my testing.py")
# # print(f.readable())
# # print(f.writable())
# # print(f)t(f.readline())
#     print(f.readlines())

# r:防止转义  防止出现不必要的信息 影响运行
举例如下
# with open(r'D:\项目路径\python13期\day07\a.txt')as f:
#     print(f.read())   # 读取文件



打开文件的三种模式:
    r :
        1、只读
        2、如果文件不存在,会报错
    w:(慎用)
        1、只写
        2、如果文件不存在,则新建一个文件写入数据
        3、如果文件内存在数据,会将数据清空,重新写入
    a:
        1、追加写
        2、如果文件内存在数据,会在已有数据的后面追加数据
        3、如果文件不存在,则新建一个文件写入数据
        
        r:
         with open(r"my testing.py",mode = 'r',encoding= 'utf-8') as f:
 		      print(f.read())
 		      print(f.readline())
              print(f.readlines())
              
         w
         with open(r'my testi.py',mode = 'w',encoding = "utf-8") as f:
              f.write('meihao shijie 世界之大')
              f.writelines(['meihaoshijie\n women de guojia'])文本模式
              
          a
          with open(r'my testi.py', mode='a', encoding="utf-8") as f:
               f.write('zhege shiie  非常的美好 这个是字符串')
               
           控制文件读写内容的处理模式   
           tb模式不能单独使用,必须与r/w/a之一结合使用
           
           t 默认的是:文本模式
           1.读写文件都是以字符串为单位的;
           2.只能针对文本文件;
           3.必须指定encoding参数。
           
           b:二进制模式:
           1.读写文件都是以bytes/二进制为单位的;
           2.针对所有文件;
           3.一定不能指定encoding参数。
           
           
     b      
  with open(r'E:\PycharmProjects\study\my testing.py',mode ='rb') as f:
     print(f.read())

  with open(r'E:\PycharmProjects\study\.idea\11.jpg', mode='rb') as rf,\
          open(r'ling.png', mode='wb') as wf:
      ling = rf.read()
      wf.write(ling)
      
      
     文件处理的内置方法:
     读:
     f.read() #读文本:一次性独处所有的数据;
     f.readline()# 一次只读一行
     f.readlines()# 将数据全部读入内存,以换行符分隔,存入列表。
     
     写 
     f.write()#写文件
     f.writeable #是否可写
     f.writelines()#for + f.write()
     
     
     
     # inp_name = input('请输入你的名字:').strip()
# inp_pwd = input('请输入你的密码:').strip()
# with open(r'aaa.txt','r',encoding = 'utf-8') as f:
#     for line in f:
#         u,p = line.strip('\n').split(' ')   ###解压赋值
#         if inp_name == u and inp_pwd == p:
#             print('登录成功')
#         else:
#             print('账号名或者密码错误')
          

‘+’的模型

1、其他的文件模式
        r+
        w+
        a+
    ps:都说可读可写,而且带着原来的特性
        一般是不用的
        
        with open(r'aaa.txt','r+',encoding = 'utf-8') as f:
    print(f.read())
    f.write('在那个地方')
    >>>>>>>
    我们都会阿豪都爆破包租婆
    在那个地方在那个地方

光标的移动

f.seek(offset,whence)
offset: 相对偏移度 (光标移动的位数)针对的是字节
whence:指定光标位置从何开始
    0:从文件开头  t,b都是可以的
    1:从当前位置   b是可以的
    2:从文件末尾   b是可以的
    1,2 也可以使用,但是光标不能移动  ### 相对偏移度始终为“0”
    f.read()
    读出文件所有内容
    文件过大,会造成内存溢出
    f.read('int类型的参数')
    ps:
    rt:针对的就是字符
    rb:针对的是字节
     utf-8:
        中文是3个bytes
        英文是1个bytes
    gbk:
        中文的是2个bytes   英文的半角是1个bytes   全角的是2个bytes
        
        aaa.txt  :我们都会阿豪都爆破包租婆
        t
        with open(r'aaa.txt','rt',encoding = 'utf-8') as f:
    f.seek(3,0)
    print(f.tell())  #查询当前的指针位置

    print(f.read(2))
    >>>>>>>
    3
    们都
    
     ###1,2 也可以使用,但是光标不能移动  ### 相对偏移度始终为“0”####
    with open(r'aaa.txt','rt', encoding = 'utf-8') as f:
    f.seek(-3, 2)  #报错 光标不能移动
    print(f.tell())

    print(f.read(2))
    >>>>>>>
    Traceback (most recent call last):报错
  File "E:/PycharmProjects/study/11.8.py", line 72, in <module>
    f.seek(-3, 2)
io.UnsupportedOperation: can't do nonzero end-relative seeks
不报错的操作
with open(r'aaa.txt','rt', encoding = 'utf-8') as f:
    f.seek(0, 2)  ###相对的便宜度为“0”
    print(f.tell())

    print(f.read(2))
    >>>>>>>>
    我们
    6

    

检测文件是否发生变化

 1、通过f.seek(0,2),将光标移动到文件末尾
        2、通过while循环,让文件保持打开状态
            1、通过f.readline(),获取当前光标所在行的内容
            2、通过if判断,是否获取到数据,获取到数据,说明,文件被改动
            3、print

获取文件的实时监控

import time  ###定义的函数 
res = time.strftime('%Y-%m-%d %H:%M:%S')

with open(r'aaa.txt','a',encoding = 'utf-8') as f:
    f.write(f'{res} 马上就要学函数了,加油\n')
    
  下面是实时监控的编程  
with open(r'aaa.txt','r',encoding = 'utf=8') as f:
    f.seek(0,2)
    while True:
        res = f.readline()
        if res:
            print(f'录入记录:{res}')
            
            
            

文件的修改

一种方法
with open(r'name.txt','r',encoding = 'utf-8') as f:
    data = f.read()
    #print(data)

with open(r'name.txt','w',encoding = 'utf-8') as f:
    res = data.replace('tank','DSB')
    print(f.write(res))
    >>>>>>>
    sean 是DSB, Sean是非常大的DSB,Sean和他们的同事都是非常大的DSB!
    
    另外一种方法  这种方法是新建一个文本替代旧的文本,来操作   优先考虑这种
    import os
with open(r'aaa.txt','r',encoding = 'utf-8') as rf, open(r'b.txt','w',encoding = 'utf-8') as wf:
    data = rf.read()
    res = data.replace('关键','好好')
    wf.write(res)

os.remove(r'aaa.txt')
os.rename('aaa.txt','b.txt')


4、文件修改:
        1、将数据一次性全部读入内存,在内存修改该数据,
            写入原文件

            优点:
                从始至终只有一个文件
            缺点:
                如果文件过大,会造成内存溢出
        2、使用两个文件,将原文件的数据一行行读到内存,修改之后写入新文件,
            通过os模块,将原文件删除,将新文件名称改查原文件
            优点:
                从始至终,内存中只有一行数据
                对内存的压力小
            缺点:
                通过两个文件来实现的




文本:我们是虚构好过航空你看过
截断 
with open(r'aaa.txt','r+',encoding = 'utf-8') as f:
    f.truncate(6)  # 这个操作截断的功能
    print(f.read())
    # f.seek(-3,2)
    # print(f.tell())
    >>>>>>
    我们
    
    
    f.flush()  # 将内存中数据刷到硬盘
posted @ 2019-11-09 18:31  ^更上一层楼$  阅读(154)  评论(0编辑  收藏  举报