1
votes

Comment vérifier si une valeur correspond à un fichier txt

J'essaie actuellement de résoudre une solution où j'ai une valeur et un fichier texte (.txt) où je veux vérifier si la valeur dans le code se trouve quelque part dans le fichier texte.

Ce que j'ai fait actuellement, c'est que j'ai un fichier texte qui ressemble à:

def check_all(sentence, ws):
    return all(re.search(r'\b{}\b'.format(w), sentence) for w in ws)

et un code qui ressemble à:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\Users\PC\AppData\Local\Programs\Python\Python36\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "C:\Users\PC\AppData\Local\Programs\Python\Python36\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "C:/Users/test.py.py", line 324, in filter
    if any(check_all(sentence, word) for word in keyword):
  File "C:/Users/test.py.py", line 324, in <genexpr>
    if any(check_all(sentence, word) for word in keyword):
  File "C:/Users/test.py.py", line 321, in check_all
    return all(re.search(r'\b{}\b'.format(w), sentence) for w in ws)
  File "C:/Users/test.py.py", line 321, in <genexpr>
    return all(re.search(r'\b{}\b'.format(w), sentence) for w in ws)
  File "C:\Users\PC\AppData\Local\Programs\Python\Python36\lib\re.py", line 182, in search
    return _compile(pattern, flags).search(string)
TypeError: expected string or bytes-like object

Qu'est-ce que le script fait est:

qu'il a un nom_élément qui a une valeur. Ouvre le mot-clé où tous les mots-clés sont stockés

Avec la fonction check_all et pour la phrase dans les phrases: mon idée était de vérifier si le mot-clé correspond dans le fichier txt. Et si c'est le cas, nous continuons simplement le programme et si ce n'est pas le cas, nous imprimons Supprimé le mot-clé et sys.exit le programme.

Cependant, lorsque j'essaie d'exécuter ce programme maintenant, j'obtiens une erreur en disant

def filter():

    item_name = '1128062'

    keyword = [line.rstrip('\n') for line in open('keywords.txt')]

    has_good = False

    sentences = [item_name]

    def check_all(sentence, ws):
        return all(re.search(r'\b{}\b'.format(w), sentence) for w in ws)

    for sentence in sentences:
        if any(check_all(sentence, word) for word in keyword):
            has_good = True
            break

    if not has_good or keyword == "":
        print("Removed the keyword - " + str(item_name))
        sys.exit()

J'ai réalisé qu'il doit y avoir un problème concernant

999486
1117978
990583
1128062
1120618

et c'est là que j'ai le problème et je vous le demande comment je peux être en mesure de vérifier si le mot-clé correspond dans un fichier .txt et s'il ne correspond pas, nous imprimons Supprimé le mot-clé et sys.exit le programme, s'il correspond alors nous ne ne fais rien.


7 commentaires

@NoorJafri Bonjour! Hmm, je ne suis pas sûr mais je pense que c'est la raison pour laquelle j'obtiens une erreur car il est indiqué sur la sortie d'erreur File "C: /Users/test.py.py", ligne 321, dans Je crois que le problème est pour w dans ws qui, je crois, imprime caractère par caractère?


Je ne parviens pas à reproduire l'erreur lorsque j'exécute votre extrait de code. Pouvez-vous essayer de diffuser votre w en tant que str ? Comme suit: renvoie tout (re.search (r '\ b {} \ b'.format (str (w)), phrase) pour w dans ws)


Très bien, ce que je viens d'essayer et de réaliser, c'est que pour w dans ws est-ce qu'il boucle caractère par caractère dont je ne sais pas si cela pourrait être la raison pour laquelle il échoue? Parce que j'ai essayé d'imprimer ws qui m'a donné le mot-clé entier et pour w dans ws me donne caractère par caractère. @Endyd


Bon, puisque dans la boucle for, vous avez une boucle for imbriquée, donc vous allez mot-clé par mot-clé dans la boucle for externe ( for phrase in phrases ), puis vous allez char par char dans le < code> le cas échéant instruction lorsque vous dites pour mot dans mot-clé , ce qui est vraiment pour char dans mot-clé


Ouais je le crois aussi. Je pense que cela pose le problème. Cela signifie donc que j'ai besoin de résoudre d'une manière ou d'une autre qui vérifie si phrase est dans mot-clé quelque chose de cette façon?


Désolé, je me suis peut-être trompé. Je pensais que phrases étaient les mots-clés, mais je vois que ce n'est qu'une liste de nom_élément à rechercher. Les noms de variables me déroutaient.


Ohhh, je pense que je me suis plus confus que toi en fait haha. Je pense que j'ai trop compliqué cela plus que je ne le devrais. @Endyd


3 Réponses :


3
votes

En supposant que vous vouliez simplement imprimer true si le mot-clé est dans le fichier, False si le mot-clé n'est pas dans le fichier .. essayez d'exécuter le code ci-dessous ...

fichier texte :: 999486 1117978 990583 1128062 1120618

programme ::

def match_string(text):
    result = False
    keyword = [line.rstrip('\n') for line in open('keyword.txt')]
    if text in keyword:
        result = True
    return result

match_string('999487')

renvoie True

Remarque : Je ne comprends toujours pas si vous devez faire correspondre une chaîne entière ou chaque caractère d'une chaîne ...


6 commentaires

Je veux juste faire correspondre la chaîne entière pour qu'elle corresponde essentiellement au fichier txt :) Donc, etc "123456" doit correspondre à "123456" et non par caractères! - Btw n'ai-je pas besoin de parcourir le mot-clé dans ce cas?


Donc, le problème ici est qu'il quitte le programme car je pense qu'il ne passe pas en boucle par le mot-clé?


Si vous voulez voir si «123456» existe dans un fichier et que le fichier a une ligne qui est «123456789», est-ce une correspondance ou une non-correspondance? Si cela devait être une correspondance, alors vous ajouteriez simplement pour k dans le mot-clé pour envelopper le si texte dans le mot-clé et le changer en si le texte dans k .


Alors répondez à votre question. Cela ne devrait PAS être une correspondance dans ce cas. Cela signifie que si nous voulons voir '123456', nous trouvons juste après une chaîne qui a '123456' (Doit être exactement la même chose) :) @Endyd


alors la réponse réside dans le code ci-dessus. Il supprime simplement tous les mots-clés du fichier texte dans une liste, puis correspond au mot-clé requis et renvoie True si trouvé sinon False ...


Convenu. Acceptez ceci comme réponse. Maintenant que vous mentionnez que la correspondance exacte est souhaitée, vous n'aurez peut-être même pas besoin de faire if text in keyword , mais plutôt de faire if text == keyword . J'imagine que python effectue d'abord une vérification de str.size (), de sorte qu'il détecte la plupart des cas d'incompatibilité plus rapidement en temps O (1) si les longueurs sont différentes. Vérification de si le texte dans le mot-clé serait O (n) si le texte est plus court que le mot-clé



1
votes

Le module re n'est pas nécessaire ici, car il semble que nous recherchons simplement une correspondance de chaîne.

import sys

KEYWORDS_PATH = 'keyword.txt'
KEYWORDS = open(KEYWORDS_PATH).read().splitlines()

sentences = ['999487']

for sentence in sentences:
    if sentence in KEYWORDS:
        print('Removed the keyword - %s' % sentence)
        sys.exit()


1 commentaires

Ouais, il semble que c'était la réponse honnêtement! J'ai essayé cela et j'ai fini par avoir ce que je voulais!



0
votes

Vous pouvez essayer ceci:

text = "Some dummy text with numbers 123"
tokens = text.split(" ")
num = "123" # Number as string
if num in token:
    print("True")
else :
    print("False")


0 commentaires