1

英語の単語、フランス語の同等物、性別、単語の種類など、いくつかの列を含むテキスト ファイルを使用するフラッシュカード プログラムを作成しています。私の考えは、テキスト ファイルの各行を読み取るループを作成することでした。タブで区切り、行ごとにユーザー定義の Word オブジェクトのインスタンスを作成します。

次のブロック コードでは、テキスト ファイルをインポートし、リストに処理してから、以前に定義したオブジェクトのインスタンスを作成しようとしています: Word. 簡単に検索できるように、オブジェクトの名前をリストの 2 番目の項目に含めたいのですが、これができないので、誰かコードを教えてください:

    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]) 
4

5 に答える 5

3

インスタンスの を作成しdict、リストの 2 番目の項目をキーとして使用します。動的変数を作成するのは悪い考えです。

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]) 

なぜwithステートメントですか?

withファイル オブジェクトを扱うときは、キーワードを使用することをお勧めします。これには、途中で例外が発生した場合でも、スイートの終了後にファイルが適切に閉じられるという利点があります。

于 2013-11-11T20:44:08.197 に答える
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}
于 2013-11-11T20:48:48.857 に答える
0

要件に関するいくつかの明確化に応じて、適切な解決策がある場合があります

「私のアイデアは、テキスト ファイルの各行をタブで区切って読み取るループを作成することでした。」

テキスト ファイルが既に検証済みであるか、エラー処理を無視する信頼性がある場合 (たとえば、単一のタブで均等に区切られていない場合)。

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

reを使用せずに、Wordオブジェクトインスタンスを作成するために必要な(包括的な)リストを取得します

"次に、以前に定義されたオブジェクトのインスタンスを作成しようとしました: Word."

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

「簡単に検索できるように、オブジェクトの名前をリストの 2 番目の項目に付けたい」

これを例で書き直してもらえますか?

しかし、それは私にこれをさせません。

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

または、他のクラスメソッドを使用して、さまざまな属性のインスタンスを検索できます

于 2013-11-11T23:17:57.913 に答える
0

これは、名前付きタプルを使用したよりクリーンなソリューションです。それぞれを名前で検索するために使用する「単語」と呼ばれる辞書になります。

#!/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)
于 2013-11-11T20:49:39.340 に答える