美文网首页
python——文件处理

python——文件处理

作者: 秋葵2022 | 来源:发表于2018-11-21 17:31 被阅读36次

    1.文件处理

    f = open(file="file01.txt", mode="r", encoding="utf-8") #python3默认编码格式为utf-8
    data = f.read()
    print(data)
    print(type(data)) # <class 'str'>
    f.close()
    
    

    如果报错

    #UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 0: invalid continuation byte
    

    说明编码不对。

    按正常逻辑来讲,文件是以什么方式存的,就应该用什么方式去读取,比如以gb2312存的,就应该以gb2312去读。文件是以utf-8存的,就用utf-8的编码格式去读。


    2.文件处理-二进制模式

    文件在计算机中是以二进制存储的,我们可以不理会编码,直接以二进制的形式读取文件内容

    f = open(file="file01.txt", mode="rb")
    data = f.read()
    print(data)
    f.close()
    

    以二进制方式读取,mode = "rb" ,得到的结果也是二进制。

    在读取视频、图片等内容和网络传输的时候,会使用二进制方式读取。

     #打印结果 b'\xef\xbb\xbf\xe7\x94\xb0\xe7\xbb\xb4\xe9\x80\x9a\t12001\t10\r\n\xe5\xbc\xa0\xe5\xae\xb6\xe9\x93\xad\t12002\t11\r\n\xe8\x88\x92\xe5\xa8\x85\t12003\t12\r\n\xe5\xad\x99\xe7\x8e\x89\xe5\x80\xa9\t12004\t13\r\n\xe5\xbc\xa0\xe8\xb6\x85\t12005\t14\r\n\xe7\x8e\x8b\xe4\xba\xac\t12006\t15\r\n\xe5\xbb\x96\xe6\x9e\x97\xe8\x8b\xb1\t12007\t16\r\n\xe5\xbe\x90\xe6\x99\x93\xe8\x8e\x89\t12008\t17\r\n\xe9\x87\x91\xe5\x98\x89\xe7\xa5\xba\t12009\t18\r\n\xe5\x8f\x8a\xe6\xa0\xbc\t12010\t19\r\n\xe4\xba\x8e\xe5\x87\xaf\xe9\x98\xb3\t12011\t20\r\n\xe6\x9d\x8e\xe4\xbf\x8a\xe7\xba\xa2\t12012\t21\r\n\xe5\x88\x98\xe5\x86\xac\t12013\t22\r\n'
    

    3.文件处理-智能检测编码的工具

    import chardet
    f = open('file01.txt', mode="rb")
    data = f.read()
    print(chardet.detect(data))
    
    #打印结果:
    #{'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
    #confidence,表示 encoding 为 UTF-8-SIG 的概率为 1.0
    

    然后,当我们知道目标文件是什么格式后,data.decode("utf-8") 一下,就可以打印出我们需要的内容


    4. 循环读取逐条读取文件

    f = open('file01.txt', 'r', encoding='utf-8')
    for line in f:
        print(line, end="") # end = "" 表示,打印的时候以什么结尾,此处可以去掉print默认的换行符 \n
    f.close()
    

    打印结果:

    # 田维通   12001   10
    # 张家铭   12002   11
    # 舒娅    12003   12
    # 孙玉倩   12004   13
    # 张超    12005   14
    # 王京    12006   15
    # 廖林英   12007   16
    # 徐晓莉   12008   17 ...
    

    5.写文件

    #以 gbk 格式创建一个文件,写入内容“将进酒”
    f = open(file='file02.txt', mode='w', encoding='gbk')
    f.write('将进酒')
    f.close()
    
    image

    如果这个时候再写一遍,即

    f = open(file='file02.txt', mode='w', encoding='gbk') 
    f.write('杯莫停')
    f.close()
    

    得到的结果是:将原来的 file02.txt 文件覆盖掉了


    6.写文件——追加

    写入内容追加的已有内容后面

    f = open('file02.txt', 'ab')  #mode 为 ab 或 a,表示追加
    f.write('\n人生得意须尽欢'.encode('gbk'))
    f.close()
    
    image

    7.文件处理-读写混合操作文件

    f = open('file02.txt', 'r+', encoding='gbk')
    data = f.read()
    print("content:", data)
    f.write("\n锄禾日当午")
    f.write("\n汗滴禾下土")
    f.write("\n离离原上草")
    f.write("\n一岁一枯荣")
    f.close()   
    

    结果:

    image

    8.文件操作的其他功能

    (1)flush()

    f = open('f_flush.txt', 'w', encoding='utf-8')
    f.write('奇门遁甲') # 在f.close() 之前,写入的内容是在内存中的,而且可能此时txt文件里是没有内容的,所以可以加一句 f.flush(),把文件强制从内存buffer里刷新到硬盘
    #一般内存里的buffer满了会自动刷新到硬盘,但是使用 f.flush() 可控制强制刷新到硬盘
    f.close()
    

    (2)tell() seek()

    # 文本内容: hello world!
    >>> f = open('file03.txt', 'r', encoding='gbk')
    >>> f.tell() #返回当前文件操作光标位置 
    0
    >>> f.seek(1) # 把操作文件的光标移到指定位置
    1
    >>> f.read()
    'ello world!'
    

    注意:tell(), seek()找的都是字节,长度都是按字节算的。另外,每个字符在不同编码格式下所占的字节长度不一样,gbk 一个中文占2个字节,utf-8 一个中文占3个字节

    以中文为例:

    # 文件内容:技高一筹
    >>> f = open("file03.txt",'r',encoding='gbk')
    >>> f.read()
    '技高一筹'
    >>> f.tell()
    8
    >>> f.seek(0) #把文件光标移动到起点 0
    0
    >>> f.seek(4) #把文件光标移动到 4,此时,gbk 下,一个汉字占2个字节,此时光标的位置在 技高和一筹之间
    4
    >>> f.read() # 所以,读取结果为 后两个字
    '一筹'
    >>>
    #-----------------------------------------------------------------------------
    >>> f.seek(1) #把文件光标移动到 1,“半个字”,此时读取内容不出问题,因为他只拿到了 技 字的一部分字节,打印会报错
    1
    >>> f.tell()
    1
    >>> f.read()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'gbk' codec can't decode byte 0xef in position 6: incomplete
     multibyte sequence
    

    (3)seekable() 判断文件是否可进行seek操作,readable() 判断文件是否可读,writable()判断文件是否可写

    (4) truncate() 按指定长度截断文件

    #文件内容: 技高一筹
    >>> f = open("file03.txt",'r+',encoding='gbk')
    >>> f.seek(2)
    2
    >>> f.truncate()
    2
    >>> f.read() #文件内容 只剩一个 “技” 字
    
    

    truncate(4)指定长度的话,就从文件开头开始截取指定长度。不指定长度的话,就从当前位置到文件尾部的内容全去掉。

    #文件内容: 技高一筹
    >>> f = open("file03.txt",'r+',encoding='gbk')
    >>> f.tell()
    0
    >>> f.truncate(4)  #文件内容 只剩一个 “技高” 字
    

    9. 实现文件内容的修改

    import os
    f = open('file05.txt', 'r+', encoding='gbk') #打开file05.txt 文件
    f_new = open('file05_new.txt', 'w', encoding='gbk') # 创建一个新文件
    
    old_str = '李四'
    new_str = '李云龙'
    for line in f:
        if old_str in line: #逐行读取
            line = line.replace(old_str, new_str)  #修改文件中的内容
        f_new.write(line) # 逐行读取的内容写到新创建的文件中
    f.close() 
    f_new.close()
    
    os.replace('file05_new.txt', 'file05.txt') # 替换,以达到修改文件内容的目的(window用os.replace()可实现,但是使用os.rename()不可以,会报错,提示 file05.txt 已存在,无法创建)
    

    相关文章

      网友评论

          本文标题:python——文件处理

          本文链接:https://www.haomeiwen.com/subject/cbgcqqtx.html