zoukankan      html  css  js  c++  java
  • 1. [文件]- 文件类型,文件open模式

    1.文件类型:文本文件和二进制文件

      硬盘中的文件保存为01010101格式,一般读取文件是把文件从硬盘中读取到内存中。

    • 文本文件需要进行格式转换才能读取出来。
    • 二进制文件一般用于传输

      

      二进制文件:视频图片

      

    2.文件打开模式

       

    几种不同的读取和遍历文件的方法比较:
    
    如果文件很小,read()一次性读取最方便;
    如果不能确定文件大小,反复调用read(size)比较保险;
    如果是配置文件,调用readlines()最方便。
    普通情况,使用for循环更好,速度更快。
    

      

    3.r rb读模式 

    (1)r 读模式

    f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='r',encoding='utf-8')
    data = f.read()
    f.close()
    file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt'  表示文件路径
    mode='r'                                          表示只读(可以修改为其他)
    encoding='utf-8'                                  表示将硬盘上的 0101010 按照utf-8的规则去“断句”,再将“断句”后的每一段0101010转换成unicode的 01010101,unicode对照表中有01010101和字符的对应关系。
    f.read()                                          表示读取所有内容,内容是已经转换完毕的字符串。
    f.close()                                         表示关闭文件

      PS: 此处的encoding必须和文件在保存时设置的编码一致,不然“断句”会不准确从而造成乱码。

     (2)rb 二进制读模式

      二进制模式,通常用来读取图片、视频等二进制文件。

      注意,它在读写的时候是以bytes类型读写的,因此获得的是一个bytes对象而不是字符串。在这个读写过程中,需要自己指定编码格式。在使用带b的模式时一定要注意传入的数据类型,确保为bytes类型。

      

      (3)智能检测编码工具:chardet

    # 安装包
    C:Usersliangshuo>pip install chardet
    
    
    # 代码
    import chardet
    f = open('file_2_gbk.txt',mode='rb' )
    data = f.read()
    result = chardet.detect(data)
    print(result)
    
    # 
    {'confidence': 1.0, 'encoding': 'ascii', 'language': ''}

      

      (4)编码问题

    注意:
    
    文件操作时,以 “r”或“rb” 模式打开,则只能读,无法写入;
    硬盘上保存的文件都是某种编码的0101010,打开时需要注意:
    rb,直接读取文件保存时原生的0101010,在Python中用字节类型表示
    r和encoding,读取硬盘的0101010,并按照encoding指定的编码格式进行断句,再将“断句”后的每一段0101010转换成unicode的 010101010101,在Python中用字符串类型表示

     

    4.w wb写模式

     (1)w模式

    f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='w',encoding='utf-8')
    f.write('北大本科美国留学一次50,微信号:xxxxx')
    f.close()
    file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt'     表示文件路径
    mode='w'                                             表示只写
    encoding='utf-8'                                     将要写入的unicode字符串编码成utf-8格式
    f.write(...)                                         表示写入内容,写入的内容是unicode字符串类型,内部会根据encoding转换为制定编码的 01101010101,即:字节类型

      (2)wb模式

    f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='wb')
    f.write('北大本科美国留学一次50,微信号:xxxxx'.encode('utf-8'))
    f.close()
    file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt'      表示文件路径
    mode='wb'                                             表示只以2进制模式写
    f.write(...)                                          表示写入内容,写入的内容必须字节类型,即:是某种编码格式的0101010

      

      (3)编码问题

    注意:
    
    文件操作时,以 “w”或“wb” 模式打开,则只能写,并且在打开的同时会先将内容清空。
    
    写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:
    
    wb,写入时需要直接传入以某种编码的0100101,即:字节类型
    w 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010

    5.a ab追加模式

    f = open("兼职白领学生空姐模特护士联系方式.txt",'a',encoding="gbk")
    
    f.write("
    杜姗姗 北京  167 49 13324523342")
    f.close()
    
    
    #
    姓名        地区    身高    体重    电话
    况咏蜜     北京    171    48    13651054608
    ......
    岳妮妮     深圳    177    54    18835324553
    贺婉萱     深圳    174    52    18933434452
    叶梓萱    上海    171    49    18042432324
    杜姗姗 北京  167 49 13324523342            #这行是添加的
    文件操作时,以 “a”或“ab” 模式打开,则只能追加,即:在原来内容的尾部追加内容
    
    写入到硬盘上时,必须是某种编码的0101010,打开时需要注意:
    
    ab,写入时需要直接传入以某种编码的0100101,即:字节类型
    a 和 encoding,写入时需要传入unicode字符串,内部会根据encoding制定的编码将unicode字符串转换为该编码的 010101010

    6.混合模式r+ w+

      (1)r+ 读写模式

    f = open('file_2_gbk.txt',mode='r+' )
    data = f.read()            # 读内容
    print(data)
    f.write('
    this is last')   #写内容
    f.close()

      

      (2)w+写读模式(没用)

    w+会先把文件清空,再写新内容,
    相比w模式,只是支持了一个读功能,且还只能读已经写入的新内容。着实没什么卵用。。。
      

    7. with关键字

    with关键字用于Python的上下文管理器机制。为了防止诸如open这一类文件打开方法在操作过程出现异常或错误,或者最后忘了执行close方法,文件非正常关闭等可能导致文件泄露、破坏的问题。Python提供了with这个上下文管理器机制,保证文件会被正常关闭。在它的管理下,不需要再写close语句。注意缩进。

    with open('test.txt', 'w') as f:
        f.write('Hello, world!')

    with支持同时打开多个文件:

    with open('log1') as obj1, open('log2','w') as obj2:
        s=obj1.read()
        obj2.write(s)

    8.遍历文件

    实际上,更多的时候,我们将文件对象作为一个迭代器来使用。

    f = open('file_2_gbk.txt',mode='r' )
    for line in f:
        print(line,end='')
    f.close()
    
    
    # 
    111111111
    22222222
    33333333
    4444444

     这个方法很简单, 不需要将文件一次性读出,但是同样没有提供一个很好的控制,与readline方法一样只能前进,不能回退。

    
    
    
  • 相关阅读:
    Android开发技术周报 Issue#101
    Android开发技术周报 Issue#102
    Android开发技术周报 Issue#100
    Android开发技术周报 Issue#98
    Android开发技术周报 Issue#99
    ANDROID开发技术周报 ISSUE#90
    ANDROID开发技术周报 ISSUE#91
    Android开发技术周报 Issue#0
    Android开发技术周报 Issue#2
    c#中的delegate(委托)和event(事件)
  • 原文地址:https://www.cnblogs.com/venicid/p/8404810.html
Copyright © 2011-2022 走看看