2.2文件处理

  • 读、写、修改
  1. 示例1
  2. f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='r',encoding='utf-8')#表示文件路径
    
    data = f.read() #表示读取所有内容
    
    f.close() #表示文件关闭

    PS: 此处的encoding必须和文件在保存时设置的编码一致,不然“断句”会不准确从而造成乱码
  3.  示例2
  4. f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='rb')
    data = f.read()
    f.close()
  5. 示例2和示例1的区别在哪?
  6. 在于示例2打开文件时并未指定encoding,这是为何?是因为直接以rb模式打开了文件 ,rb是指二进制模式,数据读到内存里直接是bytes格式,如果想内容,还需要手动decode,因此在文件打开阶段,不需要指定编码
  7. 假如你不知道你要处理的文件是什么编码可怎么办呢?(智能检测编码)
  8. import chardet
    
    f = open('log',mode='rb')
    data = f.read()
    f.close()
    
    result = chardet.detect(data)
    print(result)
  9. 输出
    {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
  10. 循环文件
    f = open("兼职白领学生空姐模特护士联系方式.txt",'r',encoding="utf-8")
    
    for line in f:
        print(line)
    
    f.close()
  11. 写文件
    f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='w',encoding='utf-8')
    f.write('北大本科美国留学一次50,微信号:xxxxx')
    f.close()

     

  12. 二进制写入
    f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='wb')
    f.write('北大本科美国留学一次50,微信号:xxxxx'.encode('utf-8'))
    f.close()

     

  13. 注意:文件操作时,以 “w”或“wb” 模式打开,则只能写,并且在打开的同时会先将内容清空。
  14. 追加,把内容追加的文件底部。注意:文件操作时,以 “a”或“ab” 模式打开,则只能追加,即:在原来内容的尾部追加内容。
    f = open("兼职白领学生空姐模特护士联系方式.txt",'a',encoding="gbk")
    
    f.write("\n杜姗姗 北京  167 49 13324523342")
    f.close()

     

  15. 读写模式
    f = open("兼职白领学生空姐模特护士联系方式.txt",'r+',encoding="gbk")
    data = f.read() #可以读内容 
    print(data)
    f.write("\nblack girl  河北  167 50  13542342233") #可以写
    f.close()

     

  16. 写读模式。注意:w+会先把文件清空,再写新内容,相比w模式,只是支持了一个读功能,且还只能读已经写入的新内容。(无用的模式)
    f = open("兼职白领学生空姐模特护士联系方式.txt",'w+',encoding="gbk")
    data = f.read() 
    print(data)
    
    f.write("\nnewline 1哈哈")
    f.write("\nnewline 2哈哈")
    f.write("\nnewline 3哈哈")
    f.write("\nnewline 4哈哈")
    
    print("content",f.read())
    
    f.close()

     

  17. 文件操作其他功能
        def fileno(self, *args, **kwargs): # real signature unknown
            返回文件句柄在内核中的索引值,以后做IO多路复用时可以用到
    
        def flush(self, *args, **kwargs): # real signature unknown
            把文件从内存buffer里强制刷新到硬盘
    
        def readable(self, *args, **kwargs): # real signature unknown
            判断是否可读
    
        def readline(self, *args, **kwargs): # real signature unknown
            只读一行,遇到\r or \n为止
    
        def seek(self, *args, **kwargs): # real signature unknown
            把操作文件的光标移到指定位置
            *注意seek的长度是按字节算的, 字符编码存每个字符所占的字节长度不一样。
            如“路飞学城” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“飞”和“学”两个字中间。
            但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了。少了一个字节
    
        def seekable(self, *args, **kwargs): # real signature unknown
            判断文件是否可进行seek操作
    
        def tell(self, *args, **kwargs): # real signature unknown
            返回当前文件操作光标位置 
    
        def truncate(self, *args, **kwargs): # real signature unknown
            按指定长度截断文件
            *指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。
    
        def writable(self, *args, **kwargs): # real signature unknown
            判断文件是否可写

     

  18. 修改文件。尝试直接以r+模式打开文件,默认会把新增的内容追加到文件最后面。但我想要的是修改中间的内容 ,怎么办? 为什么会把内容添加到尾部呢?(最新测试r+会从头覆盖,测试代码如下)
    import os
    
    f_name = "兼职白领学生空姐模特护士联系方式utf8.txt"
    f_new_name = "%s.new" % f_name
    
    old_str = "乔亦菲"
    new_str = "[乔亦菲 Yifei Qiao]"
    
    f = open(f_name,'r',encoding="utf-8")
    f_new = open(f_new_name,'w',encoding="utf-8")
    
    for line in f:
    
        if old_str in line:
            new_line = line.replace(old_str,new_str)
        else:
            new_line = line
    
        f_new.write(new_line)
    
    f.close()
    f_new.close()

     

  19. 上面的代码,会生成一个修改后的新文件 ,原文件不动,若想覆盖原文件
    os.rename(f_new_name,f_name) #把新文件名字改成原文件 的名字,就把之前的覆盖掉了,windows使用os.replace # 帮助文档说明replace会覆盖原文件

     

转载于:https://www.cnblogs.com/sszy/p/8841440.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值