我正在从python运行几个不同的unix命令作为子进程(使用python的subprocess模块),这些命令会生成文件,稍后将在管道中使用这些文件。我想知道是否有一种优雅的方法来获取这些子流程生成的文件的列表。目前,我只是在使用这样的东西:
self.fastQFiles = []
for filename in os.listdir(self.workdir):
if re.search(r'\.fastq$', filename, re.IGNORECASE):
self.fastQFiles.append(self.workdir + "/" + filename)
要搜索工作目录中的所有文件,并仅返回与给定扩展名匹配的文件。如果这是使我的正则表达式更复杂并匹配所有预期文件类型的唯一方法,但是我有点担心匹配的旧文件也会出现在搜索中,我想我可以添加一个datetime组件也是如此,但这感觉很笨拙。
有没有一种更干净的方法来返回由子进程生成的文件名?
编辑:经过更多思考之后,我能想到的最优雅的解决方案是通过集合减法来实现。
preCounter = Counter(os.listdir('/directory'))
subprocess.(processArguments)
postCounter = Counter(os.listdir('/directory'))
newFiles = list(postCounter - preCounter)
如果有更好的方法可以做到这一点,我仍然可以提出建议。
好的,所以我想到的解决方案使用@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类非常强大,并且可以用于检查已删除的文件或未更改的文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句