从目录中读取文件名

时间:2018-02-22 22:01:25

标签: python

我想使用glob获取两个单独的列表文件名,每个列表都有相同类型的文件。我有两种类型的数据文件。例如,

  1. 2018-01-02.dat
  2. 2018-01-02_patients.dat
  3. 唯一的区别是第二种文件类型后跟“_patients”。日期可以是任何格式,但格式是一致的。我怎样才能使用glob实现这一目标?

5 个答案:

答案 0 :(得分:3)

要精确匹配数字,您可以使用 glob 模式:

[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].dat  # matches e.g. 2018-01-02.dat
[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_patients.dat  # matches e.g. 2018-01-02_patients.dat

如果您确定没有任何其他相似的模式,您也可以使用?代替[0-9]来匹配任何单个字符。

In [103]: glob.glob('[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].dat')
Out[103]: ['2018-01-02.dat', '2014-03-12.dat']

In [104]: glob.glob('[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_patients.dat')
Out[104]: ['2018-01-02_patients.dat', '2014-03-12_patients.dat']

答案 1 :(得分:1)

您可以将reglob

一起使用
import glob
import re
final_files = [i for i in glob.glob('*') if re.findall('\.dat$|_patients\.dat$', i)]

答案 2 :(得分:0)

如果这些是目录中只有两种类型的文件,只需使用两个列表并从较大的列表中删除重复项,这样就可以获得所需的列表。
像这样的东西..

list1 = glob.glob('*.dat')
list2 = glob.glob('*_patients.dat')

result_list_2 = list2
result_list_1 = [x for x in list1 if x not in list2]

答案 3 :(得分:0)

touch 2018-01-02_patients.dat 2018-01-02.dat 1980-01-02.dat 1980-01-02_patients.dat

PGM:

import glob
li = glob.glob("????-*-*.dat")

patients = [fn for fn in li if "patients." in fn]
dates = [fn for fn in li if not "_patients." in fn]

print ("patients", patients)
print ("dates", dates)

输出:

('patients', ['1980-01-02_patients.dat', '2018-01-02_patients.dat'])
('dates', ['1980-01-02.dat', '2018-01-02.dat'])

答案 4 :(得分:0)

glob并不特别适合这项任务,但正则表达式是。您可以使用os.listdir(path获取所有文件的列表,并使用re.match确保存在日期,可能后跟" _patients",后面跟着"。 DAT&#34 ;.以下是我的表现:

import re
import os

pattern = '[0-9]{4}-[0-9]{2}-[0-9]{2}(_patients)?\.dat$'
def is_patient_file(filename):
    return re.match(pattern, filename) is not None

def get_patient_files(path):
    all_files = os.listdir(path)
    return filter(is_patient_file, all_files)

print(get_patient_files('.'))

正则表达式的部分是:

  • 日期:[0-9]{4}-[0-9]{2}-[0-9]{2}
    • 即四位数,短划线,两位数,短划线,两位数。
  • 也许患者:(_patients)?
  • 绝对.dat:\.dat
  • 并且不再:$