【问题标题】:deleting .txt files holding identical copies of numpy arrays删除包含相同 numpy 数组副本的 .txt 文件
【发布时间】:2020-09-24 15:35:38
【问题描述】:

我需要一种有效的方法来消除存储在文本文件中的重复整数 np 数组。情况如下:

在文件夹 C:\z_data\6_8_arrays 中,有几千个小文本文件,每个文件包含一个相同形状的数组(在本例中为 6 行 8 列)。文本文件的格式如下:

0 4 5 7 3 4 6 2
8 6 0 9 9 1 2 4
6 6 7 4 5 6 3 1
3 1 3 2 3 3 5 3
4 1 2 0 9 6 0 0
9 9 8 2 4 1 0 1

虽然许多文本数组是独一无二的,但也存在大量重复。有些数组甚至可能以相同的副本出现 25 到 30 次。

问题:有没有一种有效的方法来删除包含重复数组的文本文件 (.txt)?

我想第一步将涉及将文件夹中的所有文本数组加载到 (6,8,n) numpy 数组中,然后消除重复项。不过,最大的挑战是我实际上需要从文件夹中删除重复的文本文件。 如果一个给定的数组在例如 10 个文件中出现相同的情况,我需要消除其中的 9 个。保留 10 个文件中的哪一个并不重要。

【问题讨论】:

    标签: arrays numpy


    【解决方案1】:

    我会尝试利用对集合成员进行快速测试这一事实,因此我为每个文件生成一个哈希摘要,这样我就不需要分配内存来一次保存所有文件的全部内容。我假设文件是​​由程序生成的,因此文件中的布局和间距是一致的。

    • 为哈希摘要创建空集
    • 遍历所有文本文件,为每个文件生成哈希摘要
    • 如果摘要已在集合中,则删除文件,否则将摘要添加到集合中

    #!/usr/bin/env python3
    
    import hashlib
    from pathlib import Path
    
    # Empty set of hash digests seen so far
    seen = set()
    
    # Iterate over all text files
    for filename in Path('.').glob('*.txt'):
    
        # Read entire file and generate hash digest of its contents
        with open(filename, "rb") as f:
            digest = hashlib.sha256(f.read()).digest()
    
        # Test if same as any other
        if digest in seen:
            print(f'Would delete {filename}')
            #Path(filename).unlink()
        else:
            seen.add(digest)
    

    我生成了 8,000 个与您类似的文件,并在大约一秒钟内删除了重复文件。

    显然,请在您的文件的副本上进行测试。

    【讨论】:

      【解决方案2】:

      不是最好的方法,但可以提供帮助。

      import os
      arr_files = os.listdir('<path_with_numpy_array_files>')
      array_list = np.empty((1, 6,8))
      for arr_file in arr_files:
          flag = 0
          # load the numpy array
          arr = np.loadtxt(arr_file)       # shape of this will be 6x8
          arr_3 = arr.reshape((-1,6,8))
          for entry in array_list:
              # check if it already exists in our array list
              if np.array_equal(entry, arr):
                  # array already there, can discard that file
                  print('file to be discarded', arr_file)
                  flag = 1
                  # os.remove(arr_file)
          if flag == 0:
              array_list = np.concatenate((array_list, arr_3), axis=0)
              
      

      【讨论】:

      • 我会定义array_list=[],一个真正的列表(不是一个伪装成一个的数组),追加到列表更快(比stack;而且迭代速度也更快。
      • 你实际测试过这个吗? np.stack 每次调用时都会添加一个新维度!它对参数列表中数组的维度也很挑剔。
      • 是的,我已经测试过了。使用axis=0 堆叠将保持array_list 的维度为6x8xn 并使用for 循环,我们正在迭代n
      • array_list 以 (6,8) 开头。然后变成(2,6,8)。然后它尝试将其与 (6,8) 连接,从而导致错误。
      猜你喜欢
      • 2019-02-19
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2022-01-07
      • 2021-03-17
      • 2012-09-01
      • 2020-07-24
      相关资源
      最近更新 更多