前言:
假设现在有一个三级目录,第一级和第二级目录里面有很多子名字,最终想读取的是第三级目录里面的文件内容(比如.nc文件)
那么核心就是遍历出来所有.nc文件的路径
通过os.listdir()和os.walk()两种方法遍历文件路径
1. 使用os.listdir()函数
for file in os.listdir(filepath):
print(file) #file是filepath目录下的子目录或者非子目录的文件名
这个函数很好理解:将这个路径下面的所有文件转换为列表,那么os.listdir(filepath)就是一个列表了,而file就是列表中的元素,也就是文件名
了解这个函数后,就可以确定文件内容读取的思路了:读取当前路径下的文件名,然后通过文件名来拓展路径,再次通过拓展后的路径读取下一级的文件名,然后再进行路径的拓展,直到我们获得最终文件的路径。
具体代码是:
import os
data_path = ‘/home/data’ #这里的data_path是文件的总路径
for year in os.listdir(data_path): #data_path路径下存在你的所有年份文件
print(year) #此时打印出来的是你data_path下的所有年份
#这还没有进入一级目录,我们通过这一步仅仅获取了一级目录的文件名字
#那么我们把路径拼接起来,就可以得到第一级目录的路径名啦
year_path = data_path + '/' + year
#这里最重要的是别忘记加这个‘/’啦
#因为不加的话就不是一个完整的路径,你可以尝试print(data_path + year)看看效果
print(year_path)#此时打印出来的就是一级目录的路径
#现在我们获取了一级目录:year_path
#那么只用重复上面的程序来获得二级目录的路径:month_path
for month in os.listdir(year_path):
print (month)
month_path = year_path + '/' + month
#现在我们获取了二级目录的路径:month_path
#再重复一次就可以得到三级目录的路径:data_path
for day in os.listdir(month_path):
print(day)
day_path = month_path + '/' + day
#到了这里,我们也已经获取了三级目录的路径:day_path
#但是,我们只有路径没有用,我们还需要对day_path中的数据进行操作
#那么,我们就需要再进行一次读取,获得day_path里面的我们想操作文件路径
#假设想操作的文件是.nc文件
for nc in os.listdir(day_path):
nc_path = day_path + '/' + nc
#现在,已经获取了nc文件的路径啦,就可以在现在这个for循环程序里面对nc文件进行操作啦
dataset = netCDF4.Dataset('nc_path') # 打开nc文件
......
...... #操作操作
2. 使用os.walk()函数
for root, dirs, files in os.walk(FilePath):
# print(root) #当前目录路径
# print(dirs) #当前路径下所有子目录
# print(files) #当前路径下所有非目录子文件
os.walk函数返回三个列表,了解每一个返回列表的内容我们同样可以进行遍历所有文件的路径了
import os
data_path = ‘/home/data’ #这里的data_path是文件的总路径
for root, dirs, files in os.walk(data_path):
for nc in files:
nc_path = os.join.path(root, nc) #现在已经读取出来nc的路径啦
#接下来同样的
dataset = netCDF4.Dataset('nc_path') # 打开nc文件
......
...... #操作操作
到这里,我们就获取了整个文件夹中的.nc文件,之后可以对整个文件夹下的.nc文件进行操作,nc文件的具体操作参考下面这个链接。
使用python处理nc数据
总结:
通过两种方法的比较不难发现,使用os.listdir()函数进行文件路径的遍历看起来很不精简,好处是熟悉文件读取过程。而通过os.walk()函数进行文件路径的遍历就比较方便,代码量非常小,尤其对于多级目录,比较便捷。