我正在运行几个不同的unix命令作为来自python的子进程(使用python' s subprocess module),这些命令生成稍后将在管道中使用的文件。我想知道是否有一种优雅的方法来获取这些子进程生成的文件列表。目前我只是使用这样的东西:
self.fastQFiles = []
for filename in os.listdir(self.workdir):
if re.search(r'\.fastq$', filename, re.IGNORECASE):
self.fastQFiles.append(self.workdir + "/" + filename)
搜索工作目录中的所有文件,并仅返回与给定扩展名匹配的文件。如果这是唯一的方法,我可能会使我的正则表达式更复杂,并匹配所有预期的文件类型,但我很少担心匹配的旧文件也会出现在搜索中,我想我可以添加一个日期时间组件也是如此,但这感觉很笨重。
是否有更简洁的方法来返回子进程生成的文件名?
编辑: 在考虑了这个之后,我能想到的最优雅的解决方案是通过收集减法来做到这一点。
preCounter = Counter(os.listdir('/directory'))
subprocess.(processArguments)
postCounter = Counter(os.listdir('/directory'))
newFiles = list(postCounter - preCounter)
如果有更好的方法,我仍然愿意接受建议。
答案 0 :(得分:0)
我个人更喜欢简单的表达方式。更易于维护。如果你想炫耀你可以做同样的事情:
self.fastQFiles = [ff for ff in os.listdir(self.workdir) if re.search(r'\.fastq$', ff, re.IGNORECASE)]
或强>
self.fastQFiles = filter(lambda ff: re.search(r'\.fastq$', ff, re.IGNORECASE), os.listdir(self.workdir)
或使用旧的glob.glob()
OR 您可以切换到使用apply_async()
并使您的函数返回它们创建的文件的名称。然后你就可以在没有任何后期处理的情况下获得这样的列表。
答案 1 :(得分:0)
好吧,我提出的解决方案使用@hughdbrown创建的DictDiffer类和os.stat()。我使用os.stat()来获取st_mtime属性,该属性是上次修改文件的时间,可用于显示文件是否已从一个时间点覆盖到另一个时间点。我将所有内容存储在字典中,文件名作为键在st_mtime中作为值存储。
import os
workdir = '/path/to/directory'
preFileStats = {}
for filename in os.listdir(workdir):
preFileStats[filename] = os.stat(workdir + "/" + filename).st_mtime
subprocess.(processArguments)
postFileStats = {}
for filename in os.listdir(workdir):
postFileStats[filename] = os.stat(workdir + "/" + filename).st_mtime
class DictDiffer(object):
"""
Calculate the difference between two dictionaries as:
(1) items added
(2) items removed
(3) keys same in both but changed values
(4) keys same in both and unchanged values
"""
def __init__(self, current_dict, past_dict):
self.current_dict, self.past_dict = current_dict, past_dict
self.set_current, self.set_past = set(current_dict.keys()), set(past_dict.keys())
self.intersect = self.set_current.intersection(self.set_past)
def added(self):
return self.set_current - self.intersect
def removed(self):
return self.set_past - self.intersect
def changed(self):
return set(o for o in self.intersect if self.past_dict[o] != self.current_dict[o])
def unchanged(self):
return set(o for o in self.intersect if self.past_dict[o] == self.current_dict[o])
d = DictDiffer(postFileStats, preFileStats)
newFiles = list(d.changed()) + list(d.added())
当然DictDiffer类功能非常强大,可用于检查已删除的文件或未更改的文件。