select 目录中的某些文件

select certain files from directory

在同一个目录中我有几个文件,其中一些是样本测量值,另一些是参考文件。它们看起来像这样:

blablabla_350.dat
blablabla_351.dat
blablabla_352.dat
blablabla_353.dat
...
blablabla_100.dat
blablabla_101.dat
blablabla_102.dat

350到353结尾的是我的样本,100、101、102结尾的是参考。好的是样本和参考文献在数字上是连续的。

我想将它们分成两个不同的列表、示例和参考。

一个想法应该是这样的(还没有工作):

import glob

samples = []
references = []

ref = raw_input("Enter first reference name: ")
num_refs = raw_input("How many references are? ")

ref = sorted(glob.glob(ref+num_refs))

samples = sorted(glob.glob(*.dat)) not in references

因此参考列表将采用指定的名字和后续名称(由指定的数字给出)。所有其余的将是样品。 任何想法如何将其放入 python?

您可以使用 glob.glob 获取所有 *.dat 文件的列表,然后使用带条件的列表理解来过滤该列表。在我的解决方案中,我使用正则表达式从文件名中提取数字作为文本。然后我将它转换为一个整数并检查该整数是否位于 ref_fromref_to 之间。即使缺少编号在 ref_fromref_to 之间的一些参考文件,这仍然有效。

样本列表是通过集合运算得到的:它是从data_files的集合中去掉references的集合的结果。我们可以这样做,因为可以假定所有文件名都是唯一的。

import glob
import re

samples = []
references = []

ref_from = 350
ref_to = 353

def ref_filter(filename):
    return ref_from <= int(re.search('_([0-9]+).dat', filename).group(1)) <= ref_to

data_files = sorted(glob.glob("*.dat"))
references = [filename for filename in data_files if ref_filter(filename)]
samples = list(set(data_files) - set(references))

print references
print samples

或者,如果您知道 ref_fromref_to 之间的所有样本都将出现,您可以去掉函数 ref_filter 并替换

references = [filename for filename in data_files if ref_filter(filename)]

references = ['blablabla_' + str(n) + '.dat' for n in xrange(ref_from, ref_to + 1)]

您可以使用 glob.glob('*.dat') 获取所有文件的列表,然后根据您的条件对该列表进行切片。切片将从第一个引用名称的索引开始,并且与引用的数量一样大。

提取该切片以获取您的参考。删除该切片以获取样本。

import glob

samples = []
references = []

ref = raw_input("Enter first reference name: ")        # blablabla_100.dat
num_refs = int(raw_input("How many references are? ")) # 3

all_files = sorted(glob.glob('*.dat'))
first_ref = all_files.index(ref)
ref_files = all_files[first_ref:first_ref+num_refs]

sample_files = all_files
del sample_files[first_ref:first_ref+num_refs]
del all_files

print ref_files, sample_files

结果:

['blablabla_100.dat', 'blablabla_101.dat', 'blablabla_102.dat'] ['blablabla_350.dat', 'blablabla_351.dat', 'blablabla_352.dat', 'blablabla_353.dat']

试试

import glob

samples = []
references = []

ref = raw_input("Enter first reference name: ")
num_refs = int(raw_input("How many references are? "))

for number in num_refs:
    refferences.append(ref+number)

for filename in sorted(glob.glob('*.dat')):
    if filename not in refferences:
        samples.append(filename)

您也可以在没有 glob 的情况下使用 os 包来完成此操作:

import os, re

files = os.listdir(r'C:\path\to\files')
samples, references = [], []
for file in files:
    if re.search(r'blablabla_1\d{2}', file):
        references.append(file)
    elif re.serach(r'blablabla_3\d{2}', file):
        samples.append(file)
    else:
        print('{0} is neither sample nor reference'.format(file))