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)系统函数的结果也可能出错
Python 批处理文本文件、进行查找的更多相关文章
- Python实现对文件夹内文本文件递归查找
平台:Win7 64 bit,IDLE Python 3.4.0 经常有这样的需求:在一个文本文件里查找特定字符串,这很好实现,用任何文本查看工具几乎都可以做到.而有的时候,想查找一个文件夹下的所有文 ...
- python glob 用通配符查找指定目录中的文件 - 开源中国社区
python glob 用通配符查找指定目录中的文件 - 开源中国社区 python glob 用通配符查找指定目录中的文件
- Python中文本文件读写操作的编码问题
Python中文本文件读写的编码问题 编码(encode): 我们输入的任何字符想要以文件(如.txt)的形式保存在计算机的硬盘上, 必须先经按照一定的规则编成计算机认识的二进制后,才能存在电脑硬盘上 ...
- Python引用模块和查找模块路径
模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...
- python 读写文本文件
本人最近新学python ,用到文本文件的读取,经过一番研究,从网上查找资料,经过测试,总结了一下读取文本文件的方法. 1.在读取文本文件的时无非有两种方法: a.f=open('filename', ...
- Python入门之Python引用模块和查找模块路径
#这篇文章主要介绍了Python引用模块和Python查找模块路径的相关资料,需要的朋友可以参考下 模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的, ...
- python读取文本文件
1. 读取文本文件 代码: f = open('test.txt', 'r') print f.read() f.seek(0) print f.read(14) f.seek(0) print f. ...
- Python函数作用域的查找顺序
函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...
- python 字典有序无序及查找效率,hash表
刚学python的时候认为字典是无序,通过多次插入,如di = {}, 多次di['testkey']='testvalue' 这样测试来证明无序的.后来接触到了字典查找效率这个东西,查了一下,原来字 ...
随机推荐
- MyBatis数据持久化(九)动态sql
本文摘自:mybatis参考文档中文版 MyBatis的一个强大的特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能 ...
- HDU 2120 Ice_cream's world I【并查集】
解题思路:给出n对点的关系,求构成多少个环,如果对于点x和点y,它们本身就有一堵墙,即为它们本身就相连,如果find(x)=find(y),说明它们的根节点相同,它们之间肯定有直接或间接的相连,即形成 ...
- 路飞学城Python-Day10
[37.函数-命名空间]命名空间又称为name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量 x = 1,存放于内存中,那名字x存放在哪里呢?名称空间正式存放名字x和1绑定关 ...
- Msql免安装版安装
文首提要: 我下载的MySQL版本是:mysql-5.7.17-winx64.zip Archive版:系统:Windows7 64位. 一.解压文件 下载好MySQL后, ...
- 算法38---292. Nim游戏
1.题目: 你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函 ...
- HDU-1358 Period 字符串问题 KMP算法 求最小循环节
题目链接:https://cn.vjudge.net/problem/HDU-1358 题意 给一个字符串,对下标大于2的元素,问有几个最小循环节 思路 对每个元素求一下minloop,模一下就好 提 ...
- luogu P1375 小猫(卡特兰数)
题意 (n<=200000) 题解 把DP转移方程写出来,这不是卡特兰数吗?然后就解决了. 做完这题我发现 DP真是一个好东西. (公式连乘所以中间要加mod要不爆longlong了) #inc ...
- P1064 金明的预算方案 (依赖性背包问题)
这道题可以用分组背包来做. 但是分组有两种方式 一种是把主件,主件+附件1,主件+附件2分成一组 组内只能选一个物品 一种是建一颗树,用树形dp的方式去做 第二种更通用,就算物品的依赖关系是森林都可以 ...
- 紫书 例题8-12 UVa 12627 (找规律 + 递归)
紫书上有很明显的笔误, 公式写错了.g(k, i)的那个公式应该加上c(k-1)而不是c(k).如果加上c(k-1)那就是这一次 所有的红气球的数目, 肯定大于最下面i行的红气球数 我用的是f的公式, ...
- System.IO.IsolatedStorage 使用 IsolatedStorageFileStream 存储信息
在C#中还有一种叫做IsolatedStorage的存储机制,他存储信息的方式类似于我们的cookie, IsolatedStorage存储独立于每一个application,换句话说我们加载多个应用 ...