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

2024-04-20 04:02:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须将两个目录与其中的.xyz文件进行比较。一个目录有原始文件(名称xa02-1-1-1-1、xa02-1-1-1-2等)。我处理所有这些文件(分子),每个文件产生3个新文件,它们的文件名末尾加了-1、-2、-3。(例如,xa02-1-1-1-1将产生xa02-1-1-1xa02-1-1-1-2xa02-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)

这是有名字的文件。 原始-文件.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

新-文件.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-3xa02-1-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

请帮帮我。我非常感谢你的帮助。你知道吗


Tags: 文件theintxtforinputstepfiles
2条回答

下面是一个实现:

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

使用Counter计算文件名删去最后2个字符后的出现次数。 结果counter对象可用于过滤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)

相关问题 更多 >