我想使用glob获取两个单独的列表文件名,每个列表都有相同类型的文件。我有两种类型的数据文件。例如,
唯一的区别是第二种文件类型后跟“_patients”。日期可以是任何格式,但格式是一致的。我怎样才能使用glob实现这一目标?
答案 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)
您可以将re
与glob
:
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
$