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

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

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

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

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

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

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

  哈哈结果

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

 

遇到的问题:

1)无效的语法

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

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

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

解决办法:

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

3) UnicodeDecodeError 错误

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

解决办法:

  百度结果

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

  结果还是无效

获得经验:

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

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

Python 批处理文本文件、进行查找的更多相关文章

  1. Python实现对文件夹内文本文件递归查找

    平台:Win7 64 bit,IDLE Python 3.4.0 经常有这样的需求:在一个文本文件里查找特定字符串,这很好实现,用任何文本查看工具几乎都可以做到.而有的时候,想查找一个文件夹下的所有文 ...

  2. python glob 用通配符查找指定目录中的文件 - 开源中国社区

    python glob 用通配符查找指定目录中的文件 - 开源中国社区 python glob 用通配符查找指定目录中的文件

  3. Python中文本文件读写操作的编码问题

    Python中文本文件读写的编码问题 编码(encode): 我们输入的任何字符想要以文件(如.txt)的形式保存在计算机的硬盘上, 必须先经按照一定的规则编成计算机认识的二进制后,才能存在电脑硬盘上 ...

  4. Python引用模块和查找模块路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...

  5. python 读写文本文件

    本人最近新学python ,用到文本文件的读取,经过一番研究,从网上查找资料,经过测试,总结了一下读取文本文件的方法. 1.在读取文本文件的时无非有两种方法: a.f=open('filename', ...

  6. Python入门之Python引用模块和查找模块路径

    #这篇文章主要介绍了Python引用模块和Python查找模块路径的相关资料,需要的朋友可以参考下 模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的, ...

  7. python读取文本文件

    1. 读取文本文件 代码: f = open('test.txt', 'r') print f.read() f.seek(0) print f.read(14) f.seek(0) print f. ...

  8. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  9. python 字典有序无序及查找效率,hash表

    刚学python的时候认为字典是无序,通过多次插入,如di = {}, 多次di['testkey']='testvalue' 这样测试来证明无序的.后来接触到了字典查找效率这个东西,查了一下,原来字 ...

随机推荐

  1. crontab中使用sudo命令的注意

    在使用crontab执行非root用户定时任务时,有时候shell脚本里需要用到sudo以获得root权限: 如: VIP_CARD=eth0 VIP_ADDR=192.168.4.119 NETMA ...

  2. STM8S103之ADC

    如何快速了解ADC,查看Reference manual中ADC registers章节,初步了解到ADC ADC buffer register和ADC data register Analog W ...

  3. HDU 1312 Red and Black【DFS】

    搜索虐我千万遍@_@-----一道搜索的水题,WA了好多好多次@_@发现是n,m搞反了-_- 题意-- 给出m行 n列的矩形,其中从@出发,不能跳到#,只能跳到'.'问最多能够跳到多少块'.' 直接搜 ...

  4. 3ds Max制作一面飘扬的旗帜效果图

    在大家平时建模过程中肯定会遇到很多力学作用的模型,它们有很多的不确定性,通过人工拖拽的手段很难达到理想的自然效果,这时我们就需要一些特殊的命令来完成我们模拟自然状态的效果.下面我们就一面飘扬的国旗来探 ...

  5. 登录生成令牌token存于redis

    package com.medic.rest.province.base.home; import java.util.HashMap;import java.util.List;import jav ...

  6. C语言基础 (2) linux命令

    01.课程回顾 链接 ln 1.txt aaa.txt  硬链接 (两个相互独立 删除一个另外一个还在) ln -s 1.txt aaa.txt软连接 (后面的是快捷方式) 硬链接只能是文件,软连接可 ...

  7. 学习爬虫:《Python网络数据采集》中英文PDF+代码

    适合爬虫入门的书籍<Python网络数据采集>,采用简洁强大的Python语言,介绍了网络数据采集,并为采集新式网络中的各种数据类型提供了全面的指导.第一部分重点介绍网络数据采集的基本原理 ...

  8. ip iproute2的典型应用

    net-tools和iproute2的命令做对比,做到简单明了,分别演示如何去获取.配置和操作系统网络信息. 以下是net-tools和iproute2的大致对比: 4.1 ip link set-- ...

  9. 紫书 习题8-4 UVa 11491 (贪心)

    题意:给你一个数, 要求删去一些数字, 使得剩下的数字最大. 这道题用贪心解决. 大家想一想, 两个数比较大小, 肯定先比较第一位的数,然后依次比较第二位,以此类推. 既然我们要保证最后的数字最大, ...

  10. SLF4j 和 common-logging

    http://blog.csdn.net/xydds/article/details/51606010