我必须将两个目录与.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
请在这里帮助我。我非常感谢任何帮助。
答案 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