• Python文件管理


    1. 文件管理

      应用程序无法操控硬件,硬件只有操作系统可以操作(除了C语言),文件存在于磁盘之上,因此Python是无法直接调用文件的,需要将指令发送个操作系统,让操作系统操作硬件进而操作文件。

      文件管理的三个步骤:打开文件、操作文件、关闭文件。

      Python文件管理

             文件操作包括r(读)、w(写,覆盖)、a(追加)、rb(以二进制方式读)、wb(以二进制方式写)、ab(以二进制方式追加)等方式,先以r的方式讲解文件管理。

    1.1 r

    1> 打开文件。

    #打开文件,发送给操作系统,文件名必须是字符串类型.指定以读(r)的模式打开,用utf-8的字符编码打开。
    f = open('‪E:Learningpython	est.txt','r',encoding='utf-8')
    result:
    OSError: [Errno 22] Invalid argument: 'u202aE:\Learning\python	est.txt'

      注意:有部分  表示转义,如U、 、 等,需要将真实的文件地址在此转义回来,通常有三种可行的方法:

    1. 用  再次转义,每个  都必须转义:
    f = open('E:\Learning\python\test.txt','r',encoding='utf-8')
    
    2. 将  换成 / :
    f = open('E:/Learning/python/test.txt','r',encoding='utf-8')
     
    3.前面加r进行转义:
    f = open(r'E:Learningpython	est.txt','r',encoding='utf-8'
    
    result:
    进程完成,退出码 0

     

    2> 打开文件获得了读的权限,现在进行读。 

    #读。操作系统接收到读的指令后读取相应的文件到内存中。
    f.read()        #发送给操作系统指令让其读

     

    3> 读完之后再关闭文件,完成一个文件操作的步骤。

    #关闭。操作系统接收到指令后关闭文件。
    f.close()        #发送给操作系统指令,让其关闭文件,进行资源回收。

      文件打开后若不关闭会进行堆积,导致计算机内存溢出,运行速度变慢,因此必须将不再使用的文件关闭。

      使用with命令可以在完成文件操作后自动关闭文件。 

    with open(r'E:Learningpython	est.txt','r',encoding='utf-8') as f : #声明变量f
        data = f.read()
        print(data)
    result:             #读取到test.txt文件内容
    zxcvbnm
    asdfghjkl
    qwertyuiop
    plmoknijb
    uhbygvtdcrdxeszwaq
    qazwsxedcrfvtgbyhn
    yhnujmikopl
    qdawfxegcthv
    yjbuknilmop
     
    
    #read后可以跟数字表示读取数字指定数量的字符
    with open(r'E:Learningpython	est.txt','r') as f :
       data = f.read(5)
       print(data)
    result:
    zxcvb
    
    
    #readline():按行读,括号有数字的话表示读取数字指定的行。
    with open(r'E:Learningpython	est.txt','r') as f :
       data = f.readline()
       print(data)
    result:zxcvbnm
    
    
    #readlines():读取多行,即读取所有文件内容为列表。可以通过for循环将列表内容取出。
    with open(r'E:Learningpython	est.txt','r') as f :
       data = f.readlines()
       for i in data:
            print(i)
    result:
    zxcvbnm
    asdfghjkl
    qwertyuiop
    plmoknijb
    uhbygvtdcrdxeszwaq
    qazwsxedcrfvtgbyhn
    yhnujmikopl
    qdawfxegcthv
    yjbuknilmop
    
    
    #for语句可以直接遍历定义的变量
    with open(r'E:Learningpython	est.txt','r') as f :
       for i in f:
           print(i)
    result:
    zxcvbnm
    asdfghjkl
    qwertyuiop
    plmoknijb
    uhbygvtdcrdxeszwaq
    qazwsxedcrfvtgbyhn
    yhnujmikopl
    qdawfxegcthv
    yjbuknilmop
     
    
    #readable():是否可读,返回布尔类型,类似的,有writeable()是否可写。
    with open(r'E:Learningpython	est.txt','w') as f :
        res = f.readable()
        print(res)
    result:
    False
    
    with open(r'E:Learningpython	est.txt','r') as f :
        res = f.readable()
        print(res)
    result:
    True

     

    1.2 w 

      使用with命令,获取写的操作步骤,向文件写入内容之后关闭文件管理。

    with open(r'E:Learningpython	est.txt','w',encoding='utf-8') as f :
       f.write('life is not a game ,it is an art' )
    result:
    #writeline()可以将内容以字符串的形式写入到文件当中。
    with open(r'E:Learningpython	est.txt','w') as f :
        f.writelines(['l','o','v','e'])
    result:

     

    1.3 a 

    with open(r'E:Learningpython	est.txt','a',encoding='utf-8') as f :
       f.write('
     it should be teraed carefully,and cherish it.' )   #
     表示换行
    result:

      

    1.4 rd

           以二进制形式来进行读写是不需要再定义字符类型(encouding)。

           源文件:

    with open(r'E:Learningpython	est.txt','rb') as f :
       data = f.read()
       print(data)
    result:                        #以二进制读,汉字会被转化成二进制文件
    b'life is not a game ,it is an art.
    it should be teraed carefully,and cherish it.
    xe7x94x9fxe6xb4xbbxe4xb8x8dxe6x98xafxe6xb8xb8xe6x88x8fxefxbcx8cxe8x80
    
    #要显示原本的格式,需要进行解码 print(data.decode()) result: life
    is not a game ,it is an art. it should be teraed carefully,and cherish it. 生活不是游戏,而是艺术。 艺术是值得珍爱的。

     

    1.5 wb、ab

      二进制写入的时候需要加b进行二进制的声明,或者使用人encode进行转码。需要注意的是ASCII码并不支持中文字体库,因此加b进行二进制写入对汉字无效。

    with open(r'E:Learningpython	est.txt','ab') as f :
       data = f.write(b'I love this man')
    result:
     
    with open(r'E:Learningpython	est.txt','ab') as f :
       data = f.write('
    我喜欢这类人'.encode(utf-8))
    result:
     
    with open(r'E:Learningpython	est.txt','ab') as f :
       data = f.write(b'
    我喜欢这类人')
    result:
    SyntaxError: bytes can only contain ASCII literal characters.


    2. 光标的移动

    原文件:E:Learningpython est.txt

      Python读取文件是按照光标的移动来读的,比如先进行一次读取全部文件内容后光标移动到末尾,再次进行读的时候光标再向后移动,内容为空,所以读取文件内容是空的。

    with open(r'E:Learningpython	est.txt','r',encoding='utf-8') as f :
        res = f.read()
        conta = f.read()
        print(conta)
    result:
    进程完成,退出码 0

           对于实验原文件,指定读取5个字符后光标移动到i之前,再指定读取两个字符时会将is读取出来。

    with open(r'E:Learningpython	est.txt','r',encoding='utf-8') as f :
        res = f.read(5)
        conta = f.read(2)
        print(conta)
    result:
    is

     

    seek(num1,num2)可以控制光标的移动。seek光标移动有三种模式,这三种模式通过num2指定:

           num2的数值:0,顶头; 1,相对位置; 2,末尾。1和2只能在bytes模式下运行,(0,1)、(0,2)除外。

           在seek中num1代表光标移动的字节。不声明用rb读取时read读取的是字符。

    1>num2= 0,顶格模式

    需要注意的是,在utf-8中一个汉字占用3个字节,生僻字占用字节更多,因此对汉字进行光标操作时num1一般为3的整数倍,保证汉字不出现“半个”的情形,使得转码能够进行。

    #修改原文件:
    语言具有无与伦比的魅力。
    life is not a game ,it is an art.
    it should be teraed carefully,and cherish it.
    生活不是游戏,而是艺术。
    艺术是值得珍爱的。
    
    with open(r'E:Learningpython	est.txt','r',encoding='utf-8') as f :
        f.seek(30)             #光标顶格后移动三个字节,移动到“言”之前               
        conta = f.read(3)        #十进制下read读取三个字符
        print(conta)
    result:
    言具有
    
    with open(r'E:Learningpython	est.txt','r',encoding='utf-8') as f :
        f.seek(4,0)
        conta = f.read(3)
        print(conta)
    result:                    #移动4个字节,在十进制下,汉字无法读取。
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa8 in position 0: invalid start byte
    
    with open(r
    'E:Learningpython est.txt','rb') as f : f.seek(4,0) conta = f.read(3) print(conta) result: b'xa8x80xe5' #二进制下可以读取文件,但无法对4字节的汉字转码 print(conta.decode()) result: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa8 in position 0: invalid start byte with open(r'E:Learningpython est.txt','rb') as f : f.seek(3,0) conta = f.read(3) print(conta.decode()) result: 言 #在二进制rb下,read也是按字节来读的。

     

    2> num2=1,相对位置模式

      1和2模式除了(0,1)和(0,2),其余情况不能在utf-8模式下运行。

    with open(r'E:Learningpython	est.txt','r',encoding='utf-8') as f :
        f.read(3)
        f.seek(3,1)
        conta = f.read(3)
        print(conta.decode())
    
    result:
    
    io.UnsupportedOperation: can't do nonzero cur-relative seeks
    
    with open(r'E:Learningpython	est.txt','rb') as f :
        f.read(3)                           #先移动三个字节,“言”之前
        f.seek(3,1)                         #按相对位置移动三个字节,“言”之后
        conta = f.read(3)                   #再读三个字节,读取“具”
        print(conta.decode(utf-8))          #转码
    result:
    具

     

    3> num2=2,末尾模式

           末尾模式下指定num1,num1数值可正可负,负数表示向前移动,正数表示向后移动(无意义),光标移动到指定的位置然后再开始读取。

    #将光标移动到最末尾:
    with open(r'E:Learningpython	est.txt','rb') as f :
        f.seek(0,2)
        conta = f.read(3)
        print(conta.decode())
    result:                               #内容为空
    进程完成,退出码 0
    
    with open(r'E:Learningpython	est.txt','rb') as f :
        f.seek(-12,2)                     #向前移动12个字节
        conta = f.read(3)                 #先读取3个字节
        data = f.read()                   #在读取光标后所有内容
        print(conta.decode())
        print(data.decode())
    result:
    得
    珍爱的

     

  • 相关阅读:
    《Python核心编程》数字类型
    我的Android进阶之旅------>Android关于Log的一个简单封装
    Flex中TabNavigator隐藏和显示选项卡
    【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)
    兔子-svnserver,client搭建
    数据库事务的隔离级别简单总结
    Oracle oledb 打包并集成到程序安装包(VC ADO訪问Oracle)
    kafka分区及副本在broker的分配
    每天进步一点点——mysql——Percona XtraBackup(innobackupex)
    CodeForces 550D Regular Bridge(构造)
  • 原文地址:https://www.cnblogs.com/ajunyu/p/10958761.html
Copyright © 2020-2023  润新知