
[英]Is there a way to exclude specific file types from a directory comparision using python
[英]Directory comparision
我有一个关于比较目录的问题。 我已请求从一台公司服务器传输数据,我在 8 个便携式硬盘驱动器中收到了这些数据,因为体积太大无法将其放在一个上。 他们每个人都包含大约 1TB 的数据。 现在,我想确保那家公司服务器上的所有文件都已完全传输,如果有任何文件丢失,我希望能够检测到它并请求它们。 问题是我从公司收到的唯一东西是一个txt文件客栈,其中有以树格式保存的详细目录结构。 原则上很好,我可以通过它一个一个地看,但由于大量的数据是无法实现的。 我可以从我收到的 8 个驱动器中的每一个驱动器中生成相同的目录列表。 但是我怎样才能十次将这个文件与那 8 个文件进行比较呢? 我尝试了不同的 python 比较代码来逐行解析,但它不起作用,因为这会逐个字符串(逐行)比较它们,但它们不是字符串格式,它们是树形格式。 有人对如何做有任何建议吗?有没有办法将树格式的文件转换为字符串格式,然后在 Python 程序中运行并进行比较? 或者我应该请求(不确定是否可能)另一个文件,其中的目录以不同于树的结构格式保存? 如果是,应该如何生成?
我试图通过 python 中的列表来解析它
您的任务包含两个子任务:
任务 2 可以通过这Tree
class 来解决:
from collections import defaultdict
class Tree:
def __init__(self):
self._children = defaultdict(Tree)
def __len__(self):
return len(self._children)
def add(self, value: str):
value = value.removeprefix('/').removesuffix('/')
if value == '':
return
first, rest = self._get_values(value)
self._children[first].add(rest)
def remove(self, value: str):
value = value.removeprefix('/').removesuffix('/')
if value == '':
return
first, rest = self._get_values(value)
self._children[first].remove(rest)
if len(self._children[first]) == 0:
del self._children[first]
def _get_values(self, value):
values = value.split('/', 1)
first, rest = values[0], ''
if len(values) == 2:
rest = values[1]
return first, rest
def __iter__(self):
if len(self._children) == 0:
yield ''
return
for key, child in self._children.items():
for value in child:
if value != '':
yield key + '/' + value
else:
yield key
def main():
tree = Tree()
tree.add('a/b/c')
tree.add('a/b/d')
tree.add('b/b/e')
tree.add('b/c/f')
tree.add('c/b/e')
# duplicates are okay
tree.add('b/c/f')
# leading and trailing slashes are okay
tree.add('b/c/f/')
tree.add('/b/c/f')
print('Before removing:', [x for x in tree])
tree.remove('a/b/c')
tree.remove('a/b/d')
tree.remove('b/b/e')
# it's okay to remove non-existent values
tree.remove('this/path/does/not/exist')
# it will not remove root-level b folder, because it's not empty
tree.remove('b')
print('After removing:', [x for x in tree])
if __name__ == '__main__':
main()
Output:
Before removing: ['a/b/c', 'a/b/d', 'b/b/e', 'b/c/f', 'c/b/e']
After removing: ['b/c/f', 'c/b/e']
所以,你的算法如下:
A-tree
);B-trees
);A-tree
文件中删除B-trees
中存在的路径;A-tree
的内容。 现在,您所需要的就是构建这些树,这是从答案开始的任务 1。 它将如何 - 取决于您在.txt
文件中的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.