python批量处理文件_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 "", line 1, in

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 "", line 1, in

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 等方式解码。

Python2 没有问题是因为 Python 2 默认以字节流(对应 Python 3 的 bytes)的方式读文件,不像 Python 3 默认解码为 unicode,把读文件的方式改为 rb 有同样的效果,不过 Python 3中处理 bytes 还可能遇到很多问题就是了……

open('filename', encoding='gbk', mode='r').read()

结果还是无效

获得经验:

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值