• 文件


    1. 什么是文件
      文件是操作系统为应用程序或者用户提供一种操作硬盘的虚拟单位
      强调:
      文件是操作系统提供的虚拟单位
      应用程序或者用户对文件的读写操作其实都是向操作系统发送指令

    2. 为何要用文件
      文件对应的硬盘空间,如果需要考虑永久保存数据那必须使用文件

    3. 如何用文件
     路径问题
       绝对路径:
        win: C:acd.txt
        linux: /a/b/c/d.txt
      相对路径: 相对于当前执行文件所在文件夹

      1 打开文件
       f=open(r'文件地址',mode='rt',encoding='utf-8')
      print(f)

      2 读/写文件
      data=f.read()
      print(data)

      3 关闭文件
      f.close() # 向操作系统发送指令,让操作系统关闭打开的文件,回收操作系统资源
         print(f)
       f.read()


    # 上下文管理
    with open('a.txt',mode='rt',encoding='utf-8') as f:

     一. 基本介绍
     控制文件读写操作的模式
       r(默认)
       w
       a

     控制文件读写内容的模式(不能单独使用,必须与r、w、a连用)
       t默认)
       b


     二. 详细介绍
    控制文件读写操作的模式
     r(默认):只读模式,以该模式打开文件,当文件不存在时则报错,当文件存在时文件指针在文件开头

    r的read:  把文件中的内容全部读入内存

    with open(r'文件地址',mode='rt',encoding='utf-8') as f:
     data=f.read()
     print(f.readable())
     print(f.writable())
    
    with open 同行后可以打开多个文件,中间用逗号隔开,
    也可以换行 with open(..................) as x, open(..........)

    r是readline:  一行一行的读

     line=f.readline()
     print(line,end='')            end=''的目的是取消print的换行,
    
     line = f.readline()
     print(line,end='')
    
     print('第三次读')
     line = f.readline()
     print(line, end='')
     print(data,type(data))
    

    r的readlines:  也是全读到内存,只不过存成的是一个列表,列表中的每一个元素都是文件的一行内容

    for line in f:
           print(line)
    
    print(f.readlines())
    

      

    w: 只写模式,以该模式打开文件,当文件不存在时创建一个空文档,当文件存在时清空文件内容,文件指针在文件开头

    with open('a.txt',mode='wt',encoding='utf-8') as f:
     print(f.readable())
     print(f.writable())
    

     

     在打开了文件不关闭的情况下,连续的写入,新写的内容总是跟在老内容之后

     f.write('你瞅啥
    ')
     f.write('瞅你那熊样
    ')
     f.write('巴拉巴拉。。。
    ')
    

    writelines:

    lines=['1111
    ','2222
    ','3333
    ']
     for line in lines:
     f.write(line)
     f.writelines(lines)

    a: 只追加写模式,以该模式打开文件,当文件不存在时创建一个空文档,当文件存在时不清空文件内容,文件指针跳到文件末尾

     控制文件读写内容的模式(不能单独使用,必须与r、w、a连用)
       t(默认):无论读写都是以字符为单位的,只能操作文本文件,必须指定encoding参数
       b:无论读写都是以bytes为单位的,可以操作所有文件,一定不能指定encoding参数

     练习:拷贝文件小程序

    with open("0.txt",mode='rt',encoding='utf-8')as f,
        open('1.txt',mode='wt',encoding='utf-8')as g:
        b=f.read()
        g.write(b)
    

      

    了解:
     +:不能单独使用,必须与rwa连用,r+ w+ a+
     with open('a.txt','r+t',encoding='utf-8') as f:
      print(f.readable())
      print(f.writable())

    encode与decode

    encode unicode - > utf-8 将unicode的字符 转为制定的二进制
    decode utf-8 - > unicode 将二进制转为unicode



     

    文件修改的两种方式

    方式一:
       1. 以读的方式打开源文件
       2. 将文件内容一次性全读入内存,在内存完成修改
       3. 以写的方式打开源文件,然后将修改后的结果一次性写入源文件
        优点:在文件修改过程中硬盘只存在一份数据
        缺点:浪费内存

    with open('b.txt',mode='rt',encoding='utf-8') as f1:
    msg=f1.read()
    new_msg=msg.replace('alex','大SB')


    with open('b.txt',mode='wt',encoding='utf-8') as f2:
    f2.write(new_msg)

     方式二
     1. 以读的方式打开源文件,以写的方式打开一个临时文件
     2. 读取源文件的一行内容到内存中,将修改的结果写入临时文件,循环往复直到改
    3. 删除源文件,将临时文件重命名为源文件名
     优点:同一时间在内存中只有文件的一行内容,更节省内容
     缺点:在文件修改过程中硬盘只存在两份数据

    import os

    with open('b.txt',mode='rt',encoding='utf-8') as read_f,
    open('.b.txt.swap',mode='wt',encoding='utf-8') as write_f:
    for line in read_f:
    write_f.write(line.replace('大SB','alex'))


    os.remove('b.txt')
    os.rename('.b.txt.swap','b.txt')

    # 强调:只有t模式下read(n),n代表字符个数,除此以外都是以字节为单位
    # with open('a.txt',mode='rt',encoding='utf-8') as f:
    # res=f.read(4)
    # print(res)

    # with open('a.txt',mode='rb') as f:
    # res=f.read(3)
    # print(res.decode('utf-8'))

    # with open('a.txt',mode='at',encoding='utf-8') as f:
    # f.truncate(3)

    # f.seek():指针移动是以字节为单位的
    # 三种模式:只有0模式既可以在t下用也可以在b下用,而1、2两种模式只能在b模式下使用
    # 0(默认的):参照文件开头
    # with open('a.txt',mode='rt',encoding='utf-8') as f:
    # f.seek(3,0)
    # print(f.tell())
    # print(f.read())

    # 1: 参照指针当前所在的位置
    # with open('a.txt',mode='rb') as f:
    # f.read(2)
    # f.seek(4,1)
    # print(f.tell())
    # print(f.read().decode('utf-8'))

    # 2: 参照文件末尾
    # with open('a.txt',mode='rb') as f:
    # f.seek(-5,2)
    # print(f.tell())
    # print(f.read().decode('utf-8'))

    # tail -f access.log
    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.1)
    else:
    print(line.decode('utf-8'),end='')

  • 相关阅读:
    js 简单getByClass得封装
    微信红包的随机算法
    js 淘宝评分
    HDU 1023 Train Problem II( 大数卡特兰 )
    HDU 1576 A/B( 逆元水 )
    HDU 5533 Dancing Stars on Me( 有趣的计算几何 )
    POJ 1664 放苹果( 递推关系 )
    HDU 2095 find your present (2)( 位运算 )
    POJ 3517 And Then There Was One( 约瑟夫环模板 )
    POJ 1988 Cube Stacking( 带权并查集 )*
  • 原文地址:https://www.cnblogs.com/pdun/p/10237017.html
Copyright © 2020-2023  润新知