zoukankan      html  css  js  c++  java
  • Python 批处理文本文件、进行查找

    去年换了一部手机,老手机终于光荣退休了,但是里面的便签里还存有很多文字记录,这个手机还不能备份到云,只能将每个便签保留为一个个的文本文件,我想要把所有的文本文件归到一个文本文件中,手动操作太麻烦了,刚好去年学了python,我不由自主的就想到能做一个小程序来帮我完成这个任务

    包含:文件编码、批量处理文件、open()

    任务描述:打开文件夹中所有的.txt文件,读取每个文件的内容,并将内容写入到我指定的文本文件中

    我觉得相比上一个任务,这个应该简单很多,循环打开,读取,写入,所以这次没树头发就开始做了,万万没想到,程咬金第一步就杀出来了,我发现以自己的水平写不出来打开文件夹下每个文本文件的函数,果然我头发多是有原因的

    首先我想到用目录名称+模糊名的方法,果然不出我所料,没鸟用。马上百度

    searchObjFile=open('*.txt')
    print(searchObjFile)
    

      找到了 listdir(path) 会返回path下所有文件名的一个列表,但我还不满足,我不想再用正则表达式再去从里面把.txt的文件挑出来,我又一次开始了检索,我在知识的大海里游啊游,终于找到了 os.path.splitext(path)   这个函数会分割路径,返回路径名和文件扩展名的元组

      哈哈结果

    #! python3
    # chapter08-test03.py - 打开文件夹中所有的.txt文件
    #   结果打印在屏幕上
    import os,re
    import chardet 
    #****不能解决访问文件夹中嵌套的文件夹中的文本
    
    #定义获取文件编码的函数
    def get_encoding(file):
        with open(file,'rb') as f:
            return chardet.detect(f.read())['encoding']
    
    path=os.path.join('F:便签')  
    #不能保存在当前文件夹下,否则重复执行时会造成二次写
    toSavePath=r'F:allNoteText'
    #判断要保存在的文件夹是否存在,然后再创建
    if not os.path.exists(os.path.join(toSavePath)):
        os.makedirs(os.path.join(toSavePath))
        #打开名为*的文本文件,准备保留
    allNoteText=open(os.path.join(toSavePath,'allNoteText.txt'),'w+')#这里参数应该是w
    fileNameList=os.listdir(path)
    for objFile in fileNameList:
        fileType=os.path.splitext(os.path.join(path,objFile))
        #splitext()会返回路径名和扩展名的元组
        if fileType[1]=='.txt':
            correctFileName=os.path.join(path,objFile)
            encoding=get_encodin
            encoding=get_encoding(correctFileName)
            searchObjFile=open(correctFileName,encoding=encoding,errors='ignore') #创建一个文件对象
            allNoteText.write(searchObjFile.read())
            searchObjFile.close()
    allNoteText.close()
    #不知道为什么上边调用allNoteText.read()打印为空只好重新这样
    allNoteText=open(os.path.join(toSavePath,'allNoteText.txt'),'r')
    print(allNoteText.read())
    allNoteText.close()
    

     

    遇到的问题:

    1)无效的语法

    for objFile in fileNameList:
        fileType=os.path.splitext(os.path.join(path,objFile)
        #splitext()会返回路径名和扩展名的元组
        if fileType[1]=='.txt':  #提示这里的冒号无效的语法,删去这个if分支提示下面的‘print’无效语法最后发现上面行少加了一个右括号
                                  correctFileName=os.path.join(path,objFile)
                                  searchObjFile=open(correctFileName)
                                  print(searchObjFile.read())
                                  searchObjFile.close()
    
    print(fileNameList) 
    

    2)经过 os.join() 处理过的代码仍有可能出现问题,要谨慎对待,比如我就十分相信内置函数,但没想到也没想明白会出现这样的问题

    >>> path=os.path.join('D:Desktop便签
    otes_20170525152818.txt')
    >>> readObjFile=open(path)
    Traceback (most recent call last):
      File "<pyshell#75>", line 1, in <module>
        readObjFile=open(path)
    OSError: [Errno 22] Invalid argument: 'D:\Desktop\便签
    otes_20170525152818.txt'

    解决办法:

    百度 OSError: [Errno 22] Invalid argument 发现解决办法没有,后来发现了是 os.join() 函数的问题

    3) UnicodeDecodeError 错误

    >>> readObjFile.read()
    Traceback (most recent call last):
      File "<pyshell#83>", line 1, in <module>
        readObjFile.read()
    UnicodeDecodeError: 'gbk' codec can't decode byte 0x88 in position 38: illegal multibyte sequence

    解决办法:

      百度结果

    0x92 即 10010010,UTF8 中编码一个字符的第一个字节(start byte)只可能是 0xxxxxxx、110xxxxx、1110xxx、11110xxx……而后面的字节只可能是 10xxxxxx。也就是说 0x92 只能作为后面的字节,却出现在了第一个字节的位置。
    
    出现这种问题绝大部分情况是因为文件不是 UTF8 编码的(例如,可能是 GBK 编码的),而系统默认采用 UTF8 解码。解决方法是改为对应的解码方式。
    
    极少数情况是因为文件损坏了或者和一部分非 UTF8 编码混在一起,可以修复文件或采用 replace 等方式解码。
    
    Python 2 没有问题是因为 Python 2 默认以字节流(对应 Python 3 的 bytes)的方式读文件,不像 Python 3 默认解码为 unicode,把读文件的方式改为 rb 有同样的效果,不过 Python 3 中处理 bytes 还可能遇到很多问题就是了……
    open('filename', encoding='gbk', mode='r').read()
    

      结果还是无效

    获得经验:

    1)提示无效句法应在光标定位的前后寻找

    2)系统函数的结果也可能出错

  • 相关阅读:
    Http状态吗504问题复盘
    Http状态码502问题复盘
    Nginx服务的基本配置
    mysql修改root密码
    centos7开启80端口及其他端口
    tp5隐藏入口文件(基于nginx)
    使nginx支持pathinfo模式
    laravel-admin 上传图片过程中遇到的问题
    Maven介绍
    java中泛型
  • 原文地址:https://www.cnblogs.com/Gaoqiking/p/10455649.html
Copyright © 2011-2022 走看看