Python flashcard程序中单词的对象

时间:2013-11-11 20:38:51

标签: python

我正在制作一个flashcard程序,我在其中包含一个包含多个列的文本文件,例如英语单词,法语等效词,性别,单词类型等。我的想法是创建一个循环来读取每一行文本文件,按制表符分隔,并为每一行创建用户定义的Word对象的实例。

在下面的块代码中,我导入文本文件,将其处理成列表,然后尝试创建以前定义的对象的实例:Word。我希望该对象在列表中有第二个项目的名称,以便它可以轻松搜索,但它不允许我这样做,请有人帮助我代码:

    file = (open('dictionary.txt', 'r')).readline()
    import re
    line_list = re.split(r'\t', file.rstrip('\n')) 

    line_list[1] = Word(line_list[0], line_list[1], line_list[2], line_list[3]) 

5 个答案:

答案 0 :(得分:3)

创建dict个实例,并使用列表的第二项作为键。 It's a bad idea to create dynamic variables.

import re
instance_dict = {}
with open('dictionary.txt') as f:
    for line in f:
        line_list = re.split(r'\t', line.rstrip('\n')) 
        instance_dict[line_list[1]] = Word(*line_list[:4]) 

Why the with statement

  

在处理文件时,最好使用with关键字   对象。这样做的好处是文件在之后正确关闭   它的套件即使在路上引发异常也会完成。

答案 1 :(得分:1)

您还可以使用csv模块:

import csv

instances = {}
with open('dictionary.txt', 'rb') as f:
    reader = csv.reader(f, delimiter='\t')
    instances = {line[1]: Word(*line) for line in reader}

答案 2 :(得分:0)

这是一个使用namedtuple的更清洁的解决方案。您最终会得到一个dict名为“words”的词,您可以使用它来按名称查找每个词。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pprint
from collections import namedtuple

Word = namedtuple('Word', ['name', 'french', 'gender', 'type_'])

words = {}
with open('dictionary.txt', 'rU') as fin:
    for word in (Word(*r.rstrip('\n').split('\t')) for r in fin):
        words[word.name] = word

pprint.pprint(words)

答案 3 :(得分:0)

首先,最好使用with作为语句来获取文件的输入,因为结束程序会自动处理。其次,要读取文件中的所有行,必须使用readlines()而不是readline()。尝试这样的事情:

with open('dictionary.txt','r') as file : 
    line_list = file.readlines() 
splitLineList = [] 
for lines in line_list : 
    splitLineList.append(re.split(r'\t',lines.strip('\n')) 

答案 4 :(得分:0)

根据对您的要求的一些说明,您可能有适当的解决方案

  

“我的想法是创建一个循环来读取文本文件的每一行,   用制表符分隔,“

如果文本文件已经过预先验证或可靠,则忽略错误处理(例如,不是由单个选项卡均匀分隔)。

with open('dictionary.txt', 'r') as f:
    [line.strip().split("\t") 
              for line in f.read().split("\n") 
                                  if line.strip()]

将为您提供创建Word对象实例所需的(综合)列表,而无需使用re

  

然后尝试创建以前定义的对象的实例:   字“。

with open('dictionary.txt', 'r') as f:
    [Word(line.strip().split("\t"))
              for line in f.read().split("\n") 
                                  if line.strip()]
  

“我希望该对象在列表中包含第二项   命名,以便它易于搜索,“

你能用一个例子重写这个吗?

  

但这不是让我这样做的,

  line_list[1] = Word(line_list[0], line_list[1], line_list[2], line_list[3]) 

抱歉,我在这里失去你,为什么使用line_list [1]来引用新创建的Word实例,其中line_list [1]本身就是一个参数?

有了你的澄清,我会有这样的事情 返工代码:

from pprint import pprint

我对你的班级定义的假设:

class Word():
    def __init__(self, **kwargs):
        self.set_attrs(**kwargs)

    def __call__(self):
        return self.get_attr("swedish_word")

    def set_attrs(self, **kwargs):
        for k, v in kwargs.iteritems():
            setattr(self, k, v)

    def get_attr(self, attr):
        return getattr(self, attr)

    def get_attrs(self):
        return ({attr.upper():getattr(self, attr) for attr in self.__dict__.keys()})

    def print_attrs(self):
        pprint(self.get_attrs())


if __name__ == '__main__':

# sample entries in dictionary.txt
#    swedish_word    english_word    article           word_type
#    hund            dog              ett                noun
#    katt            cat              ett                noun
#    sova            sleep            ett                verb

    with open('dictionary.txt', 'r') as f:
        header = f.readline().strip().split("\t")


        instances = [Word(**dict(zip(header, line.strip().split("\t"))))
                              for line in f.read().split("\n")
                                                  if line.strip()]

#        for line in f.read().split("\n"):
#             data = dict(zip(header, line.strip().split("\t")))
#             w = Word(**data)

您可以像这样获取给定swedish_word的实例属性

def print_swedish_word_properties(swedish_word):
    for instance in instances:
       if instance() == swedish_word:
           print "Properties for Swedish Word:", swedish_word
           instance.print_attrs()

print_swedish_word_properties("hund")

有这样的输出

Properties for Swedish Word: hund
{'ARTICLE': 'ett',
 'ENGLISH_WORD': 'dog',
 'SWEDISH_WORD': 'hund',
 'WORD_TYPE': 'noun'}

或者您可以使用任何其他类方法在各种属性上搜索实例