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\便签\notes_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\\便签\notes_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)系统函数的结果也可能出错

转载于:https://www.cnblogs.com/Gaoqiking/p/10455649.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值