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

Python:比较不同文件名的两个目录,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我必须将两个目录与其中的.xyz文件进行比较。一个目录有原始文件(名称xa02-1-1-1、xa02-1-1-2等)。我处理所有这些文件(分子),每个文件产生3个新文件,文件名的末尾添加了-1,-2,-3。(例如,xa02-1-1-1-1将产生xa02-1-1-1、xa02-1-1-1-2和xa02-1-1-1-3)。在此操作过程中,有些文件只生成两个新文件而不生成第三个文件,或者有些文件只生成一个新文件,有些文件甚至不生成任何输出。我想比较第一个文件夹和新文件夹,看看哪些文件没有生成3个新文件

我必须将两个目录与其中的.xyz文件进行比较。一个目录有原始文件(名称xa02-1-1-1、xa02-1-1-2等)。我处理所有这些文件(分子),每个文件产生3个新文件,文件名的末尾添加了-1,-2,-3。(例如,xa02-1-1-1-1将产生xa02-1-1-1、xa02-1-1-1-2和xa02-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
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分别生成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个字符后出现的文件名。 生成的计数器对象可用于过滤
原始\u文件\u修剪
,其中项目数不超过3

例子:
从集合导入计数器
原始\u文件\u修剪=[
‘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’,
]
下一步\u文件\u修剪=[
‘xa02-1-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”
]
#接下来的几行分别是原始文件和修剪过的文件
#下一步\u使用定义的规则修剪文件\u
下一步\u文件\u不带\u num=(n[:-2]表示下一步\u文件\u修剪)下一步\u文件\u修剪最后2个字符
下一步不带数值的文件=计数器(下一步不带数值的文件)
最终清单=[
原始文件中的m为m
如果下一步\u文件\u没有\u num\u cnt[m]<3
]
打印(最终清单)

以下是一个实现:

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

要获得文件名而不必硬编码或先将其放入文件中,您可以使用或。是的,
os.listdir
是一种更好的方法,如果在目录中查找一个级别。非常感谢@Oluwafemi Sule和@Blurp。真正的快速帮助。谢谢。我将使用
os.listdir()
,这比我使用的方法更方便。谢谢@Nish的帮助。我能请你解释一下这个
updateHash
函数吗,因为我不能完全理解它。我可以在末尾以列形式打印而不是一行打印吗?
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