【Python文件处理】递归批处理文件夹子目录内所有txt数据

因为有个需求,需要处理文件夹内所有txt文件,将txt里面的数据筛选,重新存储。

虽然手工可以做,但想到了python一直主张的是自动化测试,就想试着写一个自动化处理数据的程序。

 

一.分析数据格式

需要处理的数据是txt格式存储的。下图中一行中的数据依次是,帧、时间、编号、特征点编号、特征点名字、特征点世界坐标x,y,z,特征点屏幕坐标x,y,一共32个特征点,最后6个数据是头部姿态的位置x,y,z和偏转角度x,y,z。一行共计233个字段。

需要完成的工作是,把特征点的编号,世界坐标,屏幕坐标分别写入2个csv文件中。

因为后面需要用到svm分类器,在数据挖掘软件weka中进行分类。

 

 

二.Python文件读取操作

  需要做的是Python中txt文件读取操作,然后利用split()函数将每行的字符串分割成元组,然后利用下标讲我们需要保留的数据写入到新的txt中。

常见的Python文件读取txt的方法有3种:

  方法一:

1 f = open("foo.txt")             # 返回一个文件对象  
2 line = f.readline()             # 调用文件的 readline()方法  
3 while line:  
4     print line,                 # 后面跟 ',' 将忽略换行符  
5     # print(line, end = '')   # 在 Python 3中使用  
6     line = f.readline()  
7 
8 f.close()  

  方法二:

1 for line in open("foo.txt"):  
2     print line

  方法三:

1 f = open("c:\\1.txt","r")  
2 lines = f.readlines()#读取全部内容  
3 for line in lines  
4     print line  

 

因为需要处理的数据最后一行不完整,所以,我们只处理到倒数第二行。用readlines()读取到的是一个List,每行是一个元素。所以可以用len()方法统计有多少行,处理的时候处理到倒数第二行停止。

完成我们的需求:

 1 def readFile(filepath):
 2     f1 = open(filepath, "r")      #打开传进来的路径
 3     f_world = open("WorldData", "w")
 4     f_image = open("ImageData", "w")
 5     lines = f1.readlines()        #读取所有行
 6     lines_count = len(lines)     #统计行数
 7     for n in range(0, lines_count-1):
 8         line = lines[n]
 9         line_object = line.split('\t')
10 
11         i = 5
12 
13         worldposition = ""
14         imageposition = ""
15         while i <= 223:        #取值
16             id = line_object[i - 2]
17             world_x = line_object[i]
18             world_y = line_object[i + 1]
19             world_z = line_object[i + 2]
20             worldposition = id + " " + world_x + world_y + world_z
21             # print worldposition
22             f_world.write(worldposition)
23 
24             image_x = line_object[i + 3]
25             image_y = line_object[i + 4]
26             imageposition = id + " " + image_x + image_y
27             f_image.write(imageposition)
28 
29             i += 7
30         i -= 1
31         headposition = line_object[i - 1] + line_object[i] + line_object[i + 1]
32         headrotate = line_object[i + 2] + line_object[i + 3] + line_object[i + 4]
33         head = headposition + headrotate + "\n"
34 
35         print head
36         f_world.write(head)   # 写入文件操作
37         f_image.write(head)
38     f1.close()
39     f_image.close()
40     f_world.close()  

 

 

三.递归遍历文件夹下多个txt文件

  因为需要处理的数据不止一个,用自动化的思想来解决这个问题,需要依次遍历文件夹下多个txt文件。

代码如下:

 1 def eachFile(filepath):
 2     pathDir = os.listdir(filepath)      #获取当前路径下的文件名,返回List
 3     for s in pathDir:
 4         newDir=os.path.join(filepath,s)     #将文件命加入到当前文件路径后面
 5         if os.path.isfile(newDir) :         #如果是文件
 6             if os.path.splitext(newDir)[1]==".txt":  #判断是否是txt
 7                 readFile(newDir)                     #读文件
 8                 pass
 9         else:
10             eachFile(newDir)                #如果不是文件,递归这个文件夹的路径

 

四.对处理得到的文件进行命名

  需求是,处理完一个txt,如abc.txt,然后生成的文件,命名为World_abc.txt和Image_abc.txt,并将生成的文件保存在和源文件同样的目录下面。

  思路是,对路径就行分割,使用

    os.path.split(filepath)

返回的是一个2个元素的元祖,第一个元素是文件夹路径,第二个是文件名。

1     nowDir = os.path.split(filepath)[0]             #获取路径中的父文件夹路径
2     fileName = os.path.split(filepath)[1]           #获取路径中文件名
3     WorldDataDir = os.path.join(nowDir, "WorldData_" + fileName)        #对新生成的文件进行命名的过程
4     ImageDataDir = os.path.join(nowDir, "ImageData_" + fileName)
5 
6     f_world = open(WorldDataDir, "w")
7     f_image = open(ImageDataDir, "w")

处理完之后就哗哗哗生成一大堆了。

 

 

完整代码:

 1 # -*- coding: utf-8
 2 #读文件
 3 import os
 4 
 5 #处理文件数量
 6 count=0
 7 
 8 def readFile(filepath):
 9     f1 = open(filepath, "r")
10     nowDir = os.path.split(filepath)[0]             #获取路径中的父文件夹路径
11     fileName = os.path.split(filepath)[1]           #获取路径中文件名
12     WorldDataDir = os.path.join(nowDir, "WorldData_" + fileName)        #对新生成的文件进行命名的过程
13     ImageDataDir = os.path.join(nowDir, "ImageData_" + fileName)
14 
15     f_world = open(WorldDataDir, "w")
16     f_image = open(ImageDataDir, "w")
17     lines = f1.readlines()
18     lines_count = len(lines)
19     for n in range(0, lines_count-1):
20         line = lines[n]
21         line_object = line.split('\t')
22 
23         i = 5
24 
25         worldposition = ""
26         imageposition = ""
27         while i <= 223:
28             id = line_object[i - 2]
29             world_x = line_object[i]
30             world_y = line_object[i + 1]
31             world_z = line_object[i + 2]
32             worldposition = id + " " + world_x + world_y + world_z
33             # print worldposition
34             f_world.write(worldposition)
35 
36             image_x = line_object[i + 3]
37             image_y = line_object[i + 4]
38             imageposition = id + " " + image_x + image_y
39             f_image.write(imageposition)
40 
41             i += 7
42         i -= 1
43         headposition = line_object[i - 1] + line_object[i] + line_object[i + 1]
44         headrotate = line_object[i + 2] + line_object[i + 3] + line_object[i + 4]
45         head = headposition + headrotate + "\n"
46 
47         print head
48         f_world.write(head)
49         f_image.write(head)
50     f_world.write("world")
51     f_image.write("image")
52     f1.close()
53     f_image.close()
54     f_world.close()
55 
56     global count
57     count+=1
58 
59 def eachFile(filepath):
60     pathDir = os.listdir(filepath)      #获取当前路径下的文件名,返回List
61     for s in pathDir:
62         newDir=os.path.join(filepath,s)     #将文件命加入到当前文件路径后面
63         if os.path.isfile(newDir) :         #如果是文件
64             if os.path.splitext(newDir)[1]==".txt":  #判断是否是txt
65                 readFile(newDir)                     #读文件
66                 pass
67         else:
68             eachFile(newDir)                #如果不是文件,递归这个文件夹的路径
69 
70 
71 eachFile("D:\Python\SVM_Data")
72 print "共处理"+bytes(count)+"个txt"
View Code
 补充:

代码中添加了一个globle count变量,记录处理的txt数目,因为python语言是弱类型的语言,在函数中,想要改变全局遍历的值。

1 count=0
2 def xxx():
3     global count    #声明这里的count是全局变量count
4     count+=1

最后输出count数量的时候

1 print "共处理"+count+"个txt"        #报错,字符类型和值类型不能这样输出
2 
3 print "共处理"+bytes(count)+"个txt"        #使用bytes方法,将值类型转换成字符类型

 

python OS模块的官方文档:

10.1. os.path — Common pathname manipulations — Python 2.7.13 documentation  

https://docs.python.org/2.7/library/os.path.html

转载于:https://www.cnblogs.com/SeekHit/p/6245283.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows Azure 之服务总线中继服务

Windows Azure的服务总线允许在Web服务内部与外部之间做成一个公共的连接点&#xff0c;在无需更改企业防火墙或者其他安全配置的情况下连接内部和外部的服务 而使用Azure云服务的时候由于缩放的原因通过IP来制定连接也是不科学的&#xff0c;而中继服务则可以充当很好的公共连…

【qt】QT 的信号与槽机制

QT 是一个跨平台的 C GUI 应用构架&#xff0c;它提供了丰富的窗口部件集&#xff0c;具有面向对象、易于扩展、真正的组件编程等特点&#xff0c;更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上。 QT 支持下列平台&#xff1a;MS/WINDOWS-9…

Linux 系统应用编程——进程间通信(上)

现在再Linux应用较多的进程间通信方式主要有以下几种&#xff1a; 1&#xff09;无名管道&#xff08;pipe&#xff09;及有名管道&#xff08;fifo&#xff09;&#xff1a;无名管道可用于具有亲缘关系进程间的通信&#xff1b;有名管道除具有管道相似的功能外&#xff0c;它还…

通过JDBK操作数据库

一、配置程序——让我们程序能找到数据库的驱动jar包1.把.jar文件复制到项目中去,整合的时候方便。2.在eclipse项目右击“构建路径”--“配置构建路径”--“库”--“添加外部jar”--找到数据库的驱动jar包--点击确定。会在左侧包资源管理器中出现“引用的库”&#xff0c;在里面…

Linux 系统应用编程——网络编程(常用命令解析)

1、telnet Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序&#xff0c;用它连接到服务器。终端使用者可以在telnet程序中输入命令&#…

灾难 BZOJ 2815

灾难 【样例输入】 5 0 1 0 1 0 2 3 0 2 0 【样例输出】 4 1 0 0 0 题解&#xff1a; 先跑出拓扑序 我们按拓扑序建立一棵“灭绝树” 灭绝树含义是当一个点灭绝时&#xff0c;它的子树将会全部灭绝 所以答案就是点在灭绝树中的子树大小 一个点如果灭绝&#xff0c;那么需要所有…

centos关于”running yum-complete-transaction first...

2019独角兽企业重金招聘Python工程师标准>>> 今天在用yum安装软件出错几次户&#xff0c;总是有提示信息&#xff1a; There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them. The program yum…

js身份证号、电话脱敏处理(用*替换中间数据)

数字类型 certificatecodecopy certificatecode.replace(/^(.{6})(?:\d)(.{4})$/, "\$1****\$2"); 所有类型 enginenocopy engineno.replace(/^(.{2})(?:\w)(.{1})$/, "\$1****\$2"); enginenocopy engineno.replace(/^(.{4})(?:\w)(.{4})$/, &…

Linux 系统应用编程——网络编程(I/O模型)

Unix下可用的5种I/O模型&#xff1a;阻塞I/O非阻塞I/OI/O复用(select和poll)信号驱动I/O(SIGIO)异步I/O(POSIX的aio_系列函数)一个输入操作通常包括两个不同的阶段&#xff1a;1&#xff09;等待数据准备好&#xff1b;2&#xff09;从内核向进程复制数据&#xff1b;对于一个套…

Linux 系统应用编程——网络编程(TCP/IP 数据包格式解析)

图中括号中的数字代表的是当前域所占的空间大小&#xff0c;单位是bit位。 黄色的是数据链路层的头部&#xff0c;一共14字节 绿色的部分是IP头部&#xff0c;一般是20字节 紫色部分是TCP头部&#xff0c;一般是20字节 最内部的是数据包内容 黄色部分&#xff1a;链路层 目的MA…

Linux 系统应用编程——网络编程(TCP 协议三次握手过程)

TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议&#xff0c;提供可靠的连接服务&#xff0c;采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示: SYN ( synchronous 建立联机 ) ACK ( acknowledgement 确认 ) PSH ( push 传送…

基于ELK的简单数据分析

原文链接&#xff1a; http://www.open-open.com/lib/view/open1455673846058.html 环境 CentOS 6.5 64位JDK 1.8.0_20Elasticsearch 1.7.3LogStash 1.5.6Kibana 4.1.4介绍 ElasticSearch是有名的开源搜索引擎&#xff0c;现在很多公司使用ELK技术栈做日志分析&#xff0c;比如…

[win10] 在桌面上显示计算机、控制面板、网络

1. 右击桌面&#xff0c;选择个性化 2. 选择”主题", 点击“桌面图标设置” 3. 把想要放桌面的图标给钩上

linux下共享文件夹(windows可访问,linux也可访问)

2019独角兽企业重金招聘Python工程师标准>>> 本文是转字网上的两段&#xff0c;如果是菜鸟&#xff0c;想懂有点难度&#xff0c;我这里给点注释 在linux上共享文件夹windows下看 ******************************************* 首先给linux设一个ip&#xff0c;要和…

Linux---进程调度相关命令解析

进程相关命令 1、ps 查看系统中的进程 使用方式&#xff1a;ps [options] [--help] 说明&#xff1a;显示瞬间进程 (process) 的动态 参数&#xff1a;ps的参数非常多, 在此仅列出几个常用的参数并大略介绍含义 ps命令常用用法&#xff08;方便查看系统进程&#xff09; 1&a…

Linux 系统应用编程——多线程经典问题(生产者-消费者)

“生产者——消费者”问题是Linux多线程编程中的经典问题&#xff0c;主要是利用信号量处理线程间的同步和互斥问题。 “生产者——消费者”问题描述如下&#xff1a; 有一个有限缓冲区&#xff08;这里用有名管道实现 FIFO 式缓冲区&#xff09;和两个线程&#xff1a;生产者和…

Linux 系统应用编程——进程间通信(下)

在前面&#xff0c;我们学习了传统的进程间通信方式——无名管道&#xff08;pipe&#xff09;、有名管道&#xff08;fifo&#xff09;和信号&#xff08;signal&#xff09;。 下面我们来学习 System V IPC 对象&#xff1a; 1、共享内存&#xff08;share memory&#xff0…

.balignl 16,0xdeadbeef浅析

http://zqwt.012.blog.163.com/blog/static/12044684201031102956976/ 最近在分析u-boot的源代码&#xff0c;看到这一行&#xff1a; .balignl 16, 0xdeadbeef不知道为什么要这样写&#xff0c;0xdeadbeef&#xff0c;明显是个单词组&#xff0c;写在这里有何意义呢&am…

使用maven导入任意jar包

http://mvnrepository.com/ 我这里&#xff0c;因为是spark1.5.2版本。 保存&#xff0c;maven会自动下载jar包到本地仓库。 转载于:https://www.cnblogs.com/lchzls/p/6281764.html

Linux下静态IP地址的设置及TFTP服务的搭建

TFTP&#xff08;Trivial File Transfer Protocol,简单文件传输协议&#xff09;是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。TFTP承载在UDP上&#xff0c;提供不可靠的数据流传输服务&#xff0c;…