gpt4 book ai didi

python - 查找文件中最相似的行

转载 作者:太空宇宙 更新时间:2023-11-04 10:25:17 25 4
gpt4 key购买 nike

该程序的目的是收集计算机上所有程序的列表,并根据用户输入找到正确的路径。因此,如果输入是 Audition,程序将返回C:\Adobe\Audition CC 2014\Audition CC 2014.exe

我需要它在 txt 文件中搜索与用户输入最相似的行。我的代码如下:

import os
import subprocess
import getpass
import sys
import difflib
from difflib import SequenceMatcher as SM



user = getpass.getuser()

print(os.getcwd())
exeFile = (os.getcwd() + "/paths/programpaths.txt")


def get_filepaths(directory):

file_paths = [] # List which will store all of the full filepaths.
exes = open(os.getcwd() + "/paths/programpaths.txt", "w+")
# Walk the tree.
for root, directories, files in os.walk(directory):
for filename in files:
# Join the two strings in order to form the full filepath.
filepath = os.path.join(root, filename)
file_paths.append(filepath) # Add it to the list.
if filepath.endswith('exe') and "ninstall" not in filepath and "$RECYCLE.BIN" not in filepath:
files = filepath.encode('cp850', errors='replace').decode('cp850')
#print(files + "\n")
exes.write(files + "\n")
return file_paths # Self-explanatory.



if not os.path.exists(exeFile):
print("List compilation should only happen once")
print()
print("Compiling list of installed programs")
print("This may take a while")
exes = open(os.getcwd() + "/paths/programpaths.txt", "a+")
full_file_pathsx64 = get_filepaths('C:\Program Files')
full_file_pathsx86 = get_filepaths('C:\Program Files (x86)')
full_file_pathsgames = get_filepaths('G:\\')

# Run the above function and store its results in a variable.
print("List compilation should only happen once")
print()



print("Done!")
pinput = input()



for line in open(exeFile):
prog = line.split("\\")[-1]
sim = difflib.get_close_matches(pinput, [prog], 1)
print(sim)

但是,这会为文件中的每一行打印一个空白括号“[]”,而不仅仅是给我需要的那个。

我知道这是因为我告诉它对每一行都这样做,但我不知道如何解决。

最佳答案

get_close_matches(…, 1) 调用将返回一个空列表,或者一个只包含一个匹配项的列表。

你想做的,用英语是:

  • 如果它有一个元素,打印它。
  • 否则,什么都不做。

将其直接翻译成 python:

if sim:
print(sim[0])

(你可以写else: pass表示“否则,什么都不做”,或者什么都不写。)


这解决了“不要为每一行打印 [],只打印匹配”。

但这会引发另一个问题:您实际上没有得到任何匹配项。

正如 poke 在评论中解释的那样,get_close_matches 的第二个参数是要检查的可能性列表,但是您传递的值 prog 是一个单个字符串。

如果不清楚为什么是单个字符串,请看这一行:

prog = line.split("\\")[-1]

您将字符串拆分 为更小的字符串列表,然后使用[-1] 只取最后一个字符串。

如果您对为什么没有收到错误感到好奇:字符串本身就是一系列字符串,每个字符一个。所以,如果 prog"abcde",那么您要求它处理 ['a', 'b', 'c', 'd' , 'e'] 作为 5 种独立的可能性,这是一件非常合理的事情,只是不太可能匹配任何东西。


认为您在这里想要的可能只是传递这一种可能性的列表:

sim = difflib.get_close_matches(pinput, [prog], 1)

或者,您可以建立一个包含所有可能性的大列表,然后一次搜索所有可能性,而不是一次搜索每一种可能性:

progs = []
for line in open(exefile):
progs.append(line.split("\\")[-1])
sim = difflib.get_close_matches(pinput, progs, 1)

但是在整个文件中,总共只有 1 个匹配项,而不是每行 1 个可能的匹配项。如果您希望 总数超过 1,您可以这样做,但我不确定它在处理大量数据时效果如何。 (您可以随时尝试看看。)


无论如何,希望您了解自己真正想要什么,而不必猜测。 :)

关于python - 查找文件中最相似的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29710979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com