从路径中选择文件

时间:2014-03-11 06:22:05

标签: python file-io

我有特定路径的文件,需要在namefile(yyyymmdd.faifb1p16m2.nc)上逐个选择,其中yyyy是年份,mm是月份​​,dd是日期。我做了这样的代码:

results=[]
base_dir = 'C:/DATA2013'
os.chdir(base_dir) 
files = os.listdir('C:/DATA2013')
for f in files:
    results += [each for each in os.listdir('C:/DATA2013')
    if each.endswith('.faifb1p16m2.nc')] 

如果我只选择1月份和2月份的文件,我该怎么做呢,依此类推。谢谢。

4 个答案:

答案 0 :(得分:1)

你可以这样做:

x = [i for i in results if i[4:6] == '01']

它将列出1月份的所有文件名。 假设您的所有文件格式与问题中描述的格式相同。

答案 1 :(得分:0)

要验证文件名,您可以使用datetime.strptime() method

#!/usr/bin/env python
import os
from datetime import datetime
from glob import glob

suffix = '.faifb1p16m2.nc'

def parse_date(path):
    try:
        return datetime.strptime(os.path.basename(path), '%Y%m%d' + suffix)
    except ValueError:
        return None # failed to parse


paths_by_month = [[] for _ in range(12 + 1)]
for path in glob(r'C:\DATA2013\*' + suffix): # for each nc-file in the directory
    date = parse_date(path)
    paths_by_month[date and date.month or 0].append(path)

print(paths_by_month[2]) # February paths
print(paths_by_month[0]) # paths with unrecognized date

答案 2 :(得分:0)

试试这个:

from os import *
results = []
base_dir = 'C://local'
chdir(base_dir)
files = listdir(base_dir)
for f in files:
    if '.faifb1p16m2.nc' in f and f[4:6] == '01': #describe the month in this string
        print f            

答案 3 :(得分:0)

两个正则表达式:

  1. \d{4}(?:\d?|\d{2})(?:\d?|\d{2})\.faifb1p16m2\.nc
  2. \d{8}\.faifb1p16m2\.nc
  3. 示例数据:

    1. 20140131.faifb1p16m2.nc
    2. 2014131.faifb1p16m2.nc
    3. 201412.faifb1p16m2.nc
    4. 201411.faifb1p16m2.nc
    5. 20141212.faifb1p16m2.nc
    6. 2014121.faifb1p16m2.nc
    7. 201411.faifb1p16m2.nc
    8. 第一个正则表达式将匹配所有这7个条目。第二个正则表达式只匹配1和5.我可能使正则表达式比我需要的更复杂。

      你想要第二个正则表达式,但我只是列出第一个正则表达式。

      from glob import glob
      import re
      
      re1 = r'\d{4}(?:\d?|\d{2})(?:\d?|\d{2})\.faifb1p16m2\.nc'
      re2 = r'\d{8}\.faifb1p16m2\.nc'
      
      l = [f for f in glob('*.faifb1p16m2.nc') if re.search(re1, f)]
      m = [f for f in glob('*.faifb1p16m2.nc') if re.search(re2, f)]
      
      print l
      print
      print m
      #Then, suppose you want to filter and select everything with '12' in the list m
      print filter(lambda x: x[4:6] == '12', m)
      

      作为another similar solution shows你可以为os.listdir()抛弃glob,所以:

      l = [f for f in glob('*.faifb1p16m2.nc') if re.search(re1, f)]`
      

      成为:

      l = [f for f in os.listdir() if re.search(re1, f)]
      

      然后剩下的代码很棒。使用glob的一个好处是,您可以使用iglob,它就像glob一样,但是作为迭代器,可以在浏览包含大量文件的目录时提高性能。

      还有一件事,这是另一个概述为python's infamous lambda feature的stackoverflow帖子。它通常用于函数mapreducefilter等。