使用python返回文本文件中的单词列表



我在做一个python项目。我想从文本文件返回一个名称列表。我从一个我知道的名字开始。我的文本文件是:

ALPHA;n10;Output 
ALPHA;n11;Input 
ALPHA;n12;Input 
BETA;n10;Input 
BETA;n14;Input 
CHARLIE;n10;Input 
CHARLIE;n13;Output 
DELTA;n13;Output 
DELTA;n12;Input

假设我从名称ALPHA开始我知道这是一个输出。所以我要搜索到这个名字的数字链接,也就是n10。我想返回输入中所有数字n10的名字。所以最后我想要列表["BETA", "CHARLIE"]

目前我编写了以下函数:

file = "path of the texte file"
name = "ALPHA"
liste_new_name = []
def search_new_name(liste):
file_txt = open(file, "r")
contenu = file_txt.readline()
file_txt.close()
if contenu.split(";")[0] == name and ";Output" in contenu:
num = contenu.split(";")[1]
if num in contenu and ";Input" in contenu:
liste.append(contenu.split(";")[0]
return liste
print(liste)
else:
print("No new name found")
else:
print("No num found")
search_new_name(liste_new_name)

我的问题是我有"No num found"但就像这个例子一样,我知道我应该有一个列表。

我将把文件解析为字典。这将使搜索更容易,并允许您进行多次搜索,而不必重新读取文件:

def parse_file(path):
data = {}
with open(path, 'r') as in_file:
for line in in_file:
try:
name, n, direction = line.strip().split(';')
if name not in data:
data[name] = {"Input": [], "Output": []}
data[name][direction].append(n)
except KeyError:
print(f"Error with: {line}")
except ValueError:
pass
return data

这将返回一个字典,如:

{
'ALPHA': {'Input': ['n11', 'n12'], 'Output': ['n10']},
'BETA': {'Input': ['n10', 'n14'], 'Output': []},
'CHARLIE': {'Input': ['n10'], 'Output': ['n13']},
'DELTA': {'Input': ['n12'], 'Output': ['n13']}
}

搜索可以通过一个简单的列表推导来完成:

def search_new_name(name, data):
if name not in data: return None
return [key for key,value in data.items() if any(x in data[key]["Input"] for x in data[name]["Output"])]

示例用法:

data = parse_file(r"C:foobar.txt")
print(search_new_name("ALPHA", data))

输出:

['BETA', 'CHARLIE']

您必须阅读所有行,并以'number'和'type'组合创建一个字典作为键将解决问题。

file = "path of the texte file"
name = "ALPHA"
liste_new_name = []
def search_new_name(name):
name_map = {} ## dict to save all the info
search_key = False
file_txt = open(file, "r")
all_lines = file_txt.readlines()
for contenu in all_lines:
[l_name,l_num,l_type] = contenu.split(";")
key = l_num + "_" + l_type ## use num and type combination as a key
if l_name == name and l_type == "Output":
search_key = l_num+"_"+l_type
if key in name_map:
name_map[key] = name_map[key].append(l_name)
else:
name_map[key] = [l_name]
if search_key is False:
print("Num not found")
return []
else:
search_num = search_key.split('_')[0]
if search_num+'_Input' in name_map:
return name_map[search_num+'_Input']
else:
## return empty list if no input found
return []

search_new_name(name)

我试着用两个函数来继续我的想法:

file = "path of the text file"
name = "ALPHA"
new_l_name = []
num = []
def search_num(num):
file_txt = open(file, "r")
contenu = file_txt.readline()
while contenu:
contenu = fichier_txt.readline()
if contenu.split(";")[0] == name and ";Output" in contenu:
num.append(contenu.split(";")[1]
return num
else:
print("No num found")
file_txt.close()
search_num(num)
def search_new_name(liste):
file_txt = open(file, "r")
contenu = file_txt.readline()
while contenu:
contenu = file_txt.readline()
if contenu.split(";")[1] == num[0] and ";Input" in contenu:
new_name = contenu.split(";")[0]
liste.append(new_name)
print("the list of new name : {}".format(liste))
return liste
else:
print("No new name found")
search_new_name(new_l_name)

最后,我返回了我们搜索的num,但是新名称的列表返回在文本文件中找到的第一个新名称的列表,而不是其他的。它返回["BETA"]而不是我们想要的["BETA", "CHARLIE"]。

如果有人有主意。

谢谢。

最新更新