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_from
和 ref_to
之间。即使缺少编号在 ref_from
和 ref_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_from
和 ref_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))
在同一个目录中我有几个文件,其中一些是样本测量值,另一些是参考文件。它们看起来像这样:
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_from
和 ref_to
之间。即使缺少编号在 ref_from
和 ref_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_from
和 ref_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))