我正在制作一个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])
答案 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])
在处理文件时,最好使用
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'}
或者您可以使用任何其他类方法在各种属性上搜索实例