我想知道是否有一种方法可以将分隔文本读入字典。我已经能够将它列入列表这里没有问题代码:
def _demo_fileopenbox():
msg = "Pick A File!"
msg2 = "Select a country to learn more about!"
title = "Open files"
default="*.py"
f = fileopenbox(msg,title,default=default)
writeln("You chose to open file: %s" % f)
c = []
a = []
p = []
with open(f,'r') as handle:
reader = csv.reader(handle, delimiter = '\t')
for row in reader:
c = c + [row[0]]
a = a + [row[1]]
p = p + [row[2]]
while 1:
reply = choicebox(msg=msg2, choices= c )
writeln( reply + ";\tArea: " + a[(c.index(reply))] + " square miles \tPopulation: " + p[(c.index(reply))] )
该代码使其成为3个列表,因为每行文本都是国家/地区名称,区域和人口。我就是这样,所以如果我选择一个国家,它会给我关于流行和地区的相关信息。有人说字典是一种更好的方法,但首先我不认为我可以将三个东西放入字典中的一个位置。我需要国家/地区名称作为密钥,然后是人口和区域该密钥的信息。 2个字典可能有用吗?但我只是不知道如何从文件到字典,任何帮助PLZ?
答案 0 :(得分:2)
你可以使用两个词典,但你也可以使用这样的2元组:
countries = {}
# ... other code as before
for row in reader:
countries[row[0]] = (row[1], row[2])
然后你可以像这样迭代它:
for country, (area, population) in countries.iteritems():
# ... Do stuff with country, area and population
...或者您可以访问特定国家/地区的数据:
area, population = countries["USA"]
最后,如果您计划在将来添加更多信息,您可能希望使用类作为更优雅的方式来保存信息 - 这样可以更轻松地编写不具备此功能的代码添加新内容时中断。你有这样的课程:
class Country(object):
def __init__(self, name, area, population):
self.name = name
self.area = area
self.population = population
然后你的阅读代码看起来像这样:
for row in reader:
countries[row[0]] = Country(row[0], row[1], row[2])
或者如果你有构造函数占用整行而不是单个项,你可能会发现以后更容易扩展格式,但是你还要将类更紧密地耦合到文件中的表示。这取决于您认为以后可能会延伸的方式。
然后你可以这样看:
country = countries["USA"]
print "Area is: %s" % (country.area,)
这样做的好处是,您可以添加新方法,以便将来做更聪明的事情。例如,一种返回人口密度的方法:
class Country(object):
# ...
def get_density(self):
return self.population / self.area
一般情况下,如果超出了存储多个项目的范围,我会推荐类似嵌套词典的课程。它们使您的代码更易于阅读,并且以后更容易扩展。
与大多数编程问题一样,其他方法也可行 - 这是选择最适合您的方法的一种情况。
答案 1 :(得分:1)
这样的事情应该有效:
from collections import defaultdict
myDict = {}
for row in reader:
country, area, population = row
myDict[country] = {'area': area, 'population': population}
请注意,您必须添加一些错误检查,以便在每行中有大于或少于三个分隔的项目时,代码不会中断。
您可以按如下方式访问值:
>>> myDict['Mordor']['area']
175000
>>> myDict['Mordor']['population']
3000000
答案 2 :(得分:0)
字典的值可以是人口和区域信息的元组。因此,当您在文件中阅读时,您可以执行诸如
之类的操作countries_dict = {}
for row in reader:
countries_dict[row[0]] = (row[1],row[2])
答案 3 :(得分:0)
data = []
with open(f,'r') as handle:
reader = csv.reader(handle, delimiter = '\t')
for row in reader:
(country, area, population) = row
data.append({'country': country, 'area': area, 'population': population})
数据将是词典列表。
但我不确定这是一个更好的方法,因为它会使用更多的内存。另一种选择只是列表清单:
data = list(csv.reader(open(f), delimiter='\t'))
print data
# [['USA', 'big', '300 million'], ...]