有没有办法从 csv 文件中找到只有前几个字母的单词?

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

我是编程初学者。我在 python 中为电报创建了一个英语-马拉雅拉姆语词典机器人。它工作正常。但我正在考虑升级。数据库是 CSV 文件(制表符分隔)。机器人搜索输入的单词并将结果(马拉雅拉姆语定义)回复给用户。 check screenshot here.

它搜索整个单词。但我希望机器人只用两三个字母作为输入就给我结果。例如,当我键入“ent”时,我想要所有以“ent”开头的单词的结果。 Screenshot here.

我当前的代码如下。 (搜索部分)

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

我的 CSV 文件示例:

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   നിലനില്പ്

请有人帮助我。

您可以使用 text.startswith(word) 检查第一个字母,但您还有其他一些问题导致它可能无法正常工作。

您将 entEntity 进行比较,您应该使用 lower()(或 upper())将其与 entity 进行比较。

您在 split() 之前检查 wordi[0],因此您将其与 14007 Entity n സത്ത 进行比较。您应该简单地使用 csv_reader(..., delimiter='\t') 自动拆分它 - 然后您可以与第二列 row[1]

进行比较

此代码适用于您在评论 here 中添加的文件 csv - 它为 ent

提供了 307 个结果
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))

为了使代码更具可读性,我使用变量的全名。

查看更多:PEP 8 -- Style Guide for PythonCde


编辑:

我会将结果成对 (definition, english) 而不是分开的列表。

我还会使用正则表达式来使用更复杂的搜索

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}')

结果:

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: മറ്റുള്ളവരുമായി വഴക്കടിച്ച്‌ പ്രശ്‌നമുണ്ടാക്കുക

  ...