Python:比较两个不同文件名的目录

时间:2017-11-17 03:52:43

标签: python python-3.x python-2.7

我必须将两个目录与​​.xyz文件进行比较。一个目录具有原始文件(名称为xa02-1-1-1-1,xa02-1-1-1-2等)。我处理所有这些文件(分子),每个文件产生3个新文件,其文件名最后添加-1,-2,-3。 (例如, xa02-1-1-1-1 会产生 xa02-1-1-1-1-1 xa02-1-1 -1-1-2 xa02-1-1-1-1-3 )。在此操作期间,一些文件只生成两个新文件,并且不生成第三个文件或某些文件只生成一个新文件,有些文件甚至不生成任何输出。我想比较第一个文件夹和新文件夹,看看哪些文件没有生成3个新文件。基本上我想要第一个文件夹中的文件列表,它不会产生3个新文件。 我没有找到如何使用Python,所以我使用bash打印所有文件名而没有扩展名。现在我有两个包含所有文件名的文本文件,我比较了这两个文本文件。我试图从新列表中删除最后的-1,-2,-3,并查看原始文件中的项目是否在新列表中少于3次。代码仍然给我所有文件的计数1。 任何人都可以指导我如何有效地使用Python。我需要这个用于我的博士研究,因为这样做需要花费数天来比较两个文件夹,因为它们中有大量的文件(分子)。 这是我写的代码:

# Define the lists which contain the filenames to compare
originals = "orig-files.txt"
next_step_filenames = "new-files.txt"

def read_input_file(input_filename):
    f = open(input_filename, 'r')
    fr = f.readlines()
    f.close()
    return fr
# Read the files with filenames and without extensions
original_files = read_input_file(originals)  
next_step_files = read_input_file(next_step_filenames) 

original_files_trimmed = []  # Removing the last \n from every line
for a in original_files:
    original_files_trimmed.append(a[:-1])

next_step_files_trimmed = []  # A list with the last -1, -2, -3 removed
for i in next_step_files:
    next_step_files_trimmed.append(i[:-3])

Final_list = [] # List for Files who generate <3 files 
for m in original_files_trimmed:
    for n in next_step_files_trimmed:
        count = 0
        if m in n:
            count =+ 1
            if count < 3:
                Final_list.append(m)

for b in Final_list:
    print(b)

以下是包含名称的文件。 的原稿-files.txt

xa02-1-1-1-1
xa02-1-1-1-2
xa02-1-1-2-3
xa02-1-3-3-3
xa06-3-1-2-1
xa07-1-2-1-1

新-files.txt

xa02-1-1-1-1-1
xa02-1-1-1-1-2
xa02-1-1-1-1-3
xa02-1-1-1-2-1
xa02-1-1-1-2-2
xa02-1-1-1-2-3
xa02-1-1-2-3-1
xa02-1-3-3-3-1
xa02-1-3-3-3-2
xa06-3-1-2-1-1
xa06-3-1-2-1-2
xa06-3-1-2-1-3

您可以在文件中看到 xa02-1-1-2-3 xa02-1-3-3-3 分别生成1和2个文件而 xa07-1-2-1-1 没有生成任何输出文件。我希望输出看起来像这样:

xa02-1-1-2-3   1
xa02-1-3-3-3   2
xa07-1-2-1-1   0

请在这里帮助我。我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

使用Counter计算修剪掉最后2个字符的文件名的出现次数。 生成的计数器对象可用于过滤original_files_trimmed项,其中项目最多不计3个。

实施例

from collections import Counter

original_files_trimmed = [
  'xa02-1-1-1-1',
  'xa02-1-1-1-2',
  'xa02-1-1-2-3',
  'xa02-1-3-3-3',
  'xa06-3-1-2-1',
  'xa07-1-2-1-1',
]
next_step_files_trimmed = [
  'xa02-1-1-1-1-1',
  'xa02-1-1-1-1-2',
  'xa02-1-1-1-1-3',
  'xa02-1-1-1-2-1',
  'xa02-1-1-1-2-2',
  'xa02-1-1-1-2-3',
  'xa02-1-1-2-3-1',
  'xa02-1-3-3-3-1',
  'xa02-1-3-3-3-2',
  'xa06-3-1-2-1-1',
  'xa06-3-1-2-1-2',
  'xa06-3-1-2-1-3'
]

# These next few lines diff original_files_trimmed and 
# next_step_files_trimmed using the defined rules
next_step_files_without_num = (n[:-2] for n in next_step_files_trimmed) ## trim last 2 chars    
next_step_files_without_num_cnt = Counter(next_step_files_without_num)
final_list = [
   m for m in original_files_trimmed 
   if next_step_files_without_num_cnt[m] < 3
]

print(final_list)

答案 1 :(得分:0)

这是一个实现:

def updateHash(d, key):
    if key not in d.keys():
        d[key] = 3
    else:
        d[key] -= 1

originals = "orig-files.txt"
next_step_filenames = "new-files.txt"

originals_list = []
with open(originals, 'r') as f:
    originals_list = f.read().splitlines()

next_step_list = []
with open(next_step_filenames, 'r') as f:
    next_step_list = f.read().splitlines()

expected_list = []
d = {}
for orig in originals_list:
    if orig + '-1' not in next_step_list:
        updateHash(d, orig)
    if orig + '-2' not in next_step_list:
        updateHash(d, orig)
    if orig + '-3' not in next_step_list:
        updateHash(d, orig)

print d