Home > OS >  Is there any way to find a word from a csv file with only the first few letters?
Is there any way to find a word from a csv file with only the first few letters?

Time:09-25

I'm a beginner at programming. I created an English-Malayalam dictionary bot for telegram in python. It is working fine. But I'm thinking about an upgrade. The database is a CSV file (tab separated). The bot searches for the input word and replies with the results (Malayalam definitions) to the user. check screenshot here.

It searches for the entire word. But I want the bot to give me the results with only two or three letters as input. For example, when I type "ent", I want the results of all words starting with "ent". Screenshot here.

My current code is below. (searching section)

import csv

def malayalamDict(word):
    mDict = []
    mDef = []
    eWrd = []
    with open("data/olam-enml.csv", "r") as f:
        r = csv.reader(f)
        for i in r:
            if word in i[0]:
                mDict.append(i[0].split('\t'))
        for j in range(0, len(mDict)):
            mDef.append(str(mDict[j][-1]))
        for k in range(0, len(mDict)):
            eWrd.append(str(mDict[k][1]))
    return mDef, eWrd

My CSV file example:

id english_word part_of_speech definition
14007   Entity  n   സത്ത
14008   Entity  n   അസ്‌തിത്വം
14009   Entity  n   വസ്‌തു
138185  Entity  n   നിലനില്‌പ്‌
138186  Entity  n   ഉണ്മ
207395  Entity  n   നിലനില്പ്

Please somebody help me here.

CodePudding user response:

to check first letters you can use text.startswith(word) but you have few other problems which makes that it may not work.

You compare ent with Entity and you should use lower() (or upper()) to compare it with entity.

You check word with i[0] before split() so you compare it with 14007 Entity n സത്ത. You should simply use csv_reader(..., delimiter='\t') to split it automatically - and then you can compare with second column row[1]

This code works with your file csv which you added in your comment here - it gives 307 results for ent

import csv

def malayalam_dict(word):
    malayalam_definition = []
    english_word = []
    
    word = word.lower()

    with open("olam-enml.csv", "r") as f:
        cvs_reader = csv.reader(f, delimiter='\t')

        #for (id_, english, part_of_speech, definition) in cvs_reader:
        for row in cvs_reader:
            #(id_, english, part_of_speech, definition) = row
            if row[1].lower().startswith(word):
                malayalam_definition.append(row[-1])
                english_word.append(row[1])
                
    return malayalam_definition, english_word

definitions, words = malayalam_dict('ent')

print(len(definitions))

To make code more readable I uses full names for variables.

See more: PEP 8 -- Style Guide for PythonCde


EDIT:

I would keep results as pairs (definition, english) instead of separated lists.

I would also use regex to use more complex searching

import csv
import re

def malayalam_dict(word, regex=False):
    results = []
    
    word = word.lower()
    
    with open("olam-enml.csv", "r") as f:
        cvs_reader = csv.reader(f, delimiter='\t')
        #for (id_, english, part_of_speech, definition) in cvs_reader:
        for row in cvs_reader:
            #(id_, english, part_of_speech, definition) = row
            if regex:
                if re.findall(word, row[1].lower()):
                    results.append( (row[-1], row[1]) )
            else:
                if row[1].lower().startswith(word):
                    results.append( (row[-1], row[1]) )
                
    return results

results = malayalam_dict('ent')               # normal `startswith()`
results = malayalam_dict('^ent', regex=True)  # regex

print(len(results))

for number, (definition, english) in enumerate(results, 1):
    print(f'{number:4} | {english:20}: {definition}')

Result:

307
   1 | Entail              : പ്രത്യേകപിന്‍തുടര്‍ച്ചക്രമം
   2 | Entail              : ദാനവിക്രയാദി അധികാരങ്ങളില്ലാതെ തലമുറയായി അനുഭവിക്കുന്നതിനു നല്‍കിയ സ്വത്ത്‌
   3 | Entail              : അന്യാധീനപ്പെടുത്താന്‍ പാടില്ലാത്ത വിധം നല്‍കുക
   4 | Entail              : ചുമത്തുക
   5 | Entail              : അനിവാര്യമാക്കിത്തീര്‍ക്കുക
   6 | Entail              : കൈമാറ്റം ചെയ്യാന്‍ അധികാരമില്ലാത്ത വസ്‌തുവകകളുടെ പിന്‍തുടര്‍ച്ചാവകാശം
   7 | Entail              : ആവശ്യമായി വരുക
   8 | Entail              : അന്യാധീനപ്പെടുത്താന്‍ പാടില്ലാത്ത വിധം അവകാശം കൊടുക്കുക
   9 | Entail              : കൈമാറ്റം ചെയ്യാന്‍ അധികാരമില്ലാത്ത വസ്തുവകകളുടെ പിന്‍തുടര്‍ച്ചാവകാശം
  10 | Entailer            : അവകാശമായി വിട്ടുകൊടുക്കുന്നവന്‍
  11 | Entangle            : കുടുക്കുക
  12 | Entangle            : അകപ്പെടുത്തുക
  13 | Entangle            : സങ്കീര്‍ണ്ണീകരിക്കുക
  14 | Entangle            : കെട്ടുപിണയുക
  15 | Entangle            : വിഷമിക്കുക
  16 | Entangle oneself with: മറ്റുള്ളവരുമായി വഴക്കടിച്ച്‌ പ്രശ്‌നമുണ്ടാക്കുക

  ...
  • Related