有没有办法从 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)
检查第一个字母,但您还有其他一些问题导致它可能无法正常工作。
您将 ent
与 Entity
进行比较,您应该使用 lower()
(或 upper()
)将其与 entity
进行比较。
您在 split()
之前检查 word
和 i[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: മറ്റുള്ളവരുമായി വഴക്കടിച്ച് പ്രശ്നമുണ്ടാക്കുക
...
我是编程初学者。我在 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)
检查第一个字母,但您还有其他一些问题导致它可能无法正常工作。
您将 ent
与 Entity
进行比较,您应该使用 lower()
(或 upper()
)将其与 entity
进行比较。
您在 split()
之前检查 word
和 i[0]
,因此您将其与 14007 Entity n സത്ത
进行比较。您应该简单地使用 csv_reader(..., delimiter='\t')
自动拆分它 - 然后您可以与第二列 row[1]
此代码适用于您在评论 here 中添加的文件 csv
- 它为 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))
为了使代码更具可读性,我使用变量的全名。
查看更多: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: മറ്റുള്ളവരുമായി വഴക്കടിച്ച് പ്രശ്നമുണ്ടാക്കുക
...