python 读取文件夹下所有文件的一种方法

在数据挖掘中需要大量的数据,这些数据往往存储在数据库中或者文件中。存储数据库中比较好理解,可通过 程序数据库接口+SQL语句 获取。存储在文件中则往往有多个按日期命名的文件夹,数据以文本格式存储,且有特定的分割符。本文主要就是讲述如何通过 python 读取后一类的数据。

总体思路就是先获取给定目录下所有文件的绝对路径,包括给定目录下的子目录;然后再读取每个文件的内容。

首先要获取给定目录下的所有文件的绝对路径,python 的 os.listdir(dirPath) 方法可以列出 dirPath 下的所有文件和文件夹。为了处理 dirPath 下的子目录,需要判断读出的一个对象 a 是否为文件夹,可以通过 os.path.isdir(a) 来判断读出的 a 是否为一个文件夹,如果是,则递归读出下面的文件

实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# encoding:utf-8  
# 功能:读取传入的目录下所有的文件(包括该目录下的所有子目录)的绝对路径,并以列表形式返回所有文件的绝对路径
# 要求传入的路径参数最后不能有斜杠,目的是为了递归时格式统一

import os

def readDir(dirPath):
if dirPath[-1] == '/':
print u'文件夹路径末尾不能加/'
return
allFiles = []
if os.path.isdir(dirPath):
fileList = os.listdir(dirPath)
for f in fileList:
f = dirPath+'/'+f
if os.path.isdir(f):
subFiles = readDir(f)
allFiles = subFiles + allFiles #合并当前目录与子目录的所有文件路径
else:
allFiles.append(f)
return allFiles
else:
return 'Error,not a dir'

将上面的代码命名为 ReadDirFiles.py, 便于被下面调用。现在已经可以得到某一目录下所有文件的绝对路径,下面只需要读出这些文件里面的内容即可。

为了存储的便利性,用文件存储数据时往往一行存储一条记录,一条记录中不同字段以特定分隔符分开。下面的代码就是解决这类型的数据的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# encoding:utf-8  
# 功能:解析文件中按行存放的数据,行内数据以SOH(\001)分割

import ReadDirFiles

def readFile (filePath):
with open(filePath) as f:
lines = f.readlines()
for line in lines:
data = line.split('\001') #以列表形式返回分割了的行数据
for i in data:
print i

if __name__ == '__main__':
dirPath = 'G:/20160107'
fileList=ReadDirFiles.readDir(dirPath)
for f in fileList:
readFile(f)

上面有两个需要注意的地方:

1)建议采用 with open(filePath) as f 方法打开文件,因为这种方法不需要显示调用 f.close() 来关闭文件。open 函数可在第二个形参位置决定打开文件的模式,有读(a)、写(w)、追加(a)等,省略时默认为读。

2)读取文件的行时,有 readline 和 readlines 两种方法,前者每次读一行,后者一次把文件全部行读入内存,显然后者的效率比前者要高。只有当内存太小或文件过大,无法一次全部读入内存才建议采用第一种方法。