首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中以字典形式拆分文本文件?

如何在python中以字典形式拆分文本文件?
EN

Stack Overflow用户
提问于 2012-12-31 11:25:25
回答 2查看 377关注 0票数 2

我有一个文本文件

代码语言:javascript
复制
application/andrew-inset                        ez
application/applixware                          aw
application/atom+xml                            atom
application/atomcat+xml                         atomcat
application/atomsvc+xml                         atomsvc
application/ccxml+xml                           ccxml
application/cdmi-capability                     cdmia
application/cdmi-container                      cdmic
image/jpeg                                      jpeg jpg jpe

我想转换成python的键值对字典。我怎么能做到这一点。

在多个值的情况下,我也很困惑,我该怎么办?

我想从mimetype中获取文件扩展名

所以基本上,在多个值的情况下,我想得到第一个值。

e,g

mydict['image/jpeg']应返回jpeg

这就是我所说的

代码语言:javascript
复制
import shlex
f = open("mimetypes.txt","r")
mydict = dict()
for line in f:
        k,v = shlex.split(line.strip())
        mydict[k.strip()] =  v.strip()

f.close()
f2 = open("mimetest.txt","w")
f2.write(mydict)
f2.close()

我得到了这个

代码语言:javascript
复制
Traceback (most recent call last):
  File "makedict.py", line 5, in <module>
    k,v = shlex.split(line.strip())
ValueError: too many values to unpack
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-31 11:31:18

编辑:根据您的更新,您非常接近-问题是因为这一行:

代码语言:javascript
复制
k,v = shlex.split(line.strip())

正如您所知道的,它适用于具有两个项的任何元素,但当您有多个项时,问题就来了。例如:

代码语言:javascript
复制
In [1]: import shlex

In [2]: line = 'one two'

In [3]: k,v = shlex.split(line.strip())

In [4]: print k, v
one two

In [5]: line = 'one two three'

In [6]: k,v = shlex.split(line.strip())
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/<ipython console> in <module>()

ValueError: too many values to unpack

发生的情况是,您正在尝试使用包含三个项目的列表为两个变量赋值,这将给您带来错误。您可以在代码中做的一件事是通过执行以下操作将返回的列表限制为只返回两个项:

代码语言:javascript
复制
In [7]: line = 'one two three'

In [8]: k,v = shlex.split(line.strip())[:2]

In [9]: print k, v
one two

一般的想法是创建一个字典,打开文件,然后在每一行上,去掉尾随的换行符,拆分空格,并获取结果列表的前两个元素:

代码语言:javascript
复制
In [5]: d = {}

In [6]: with open('mime.txt', 'rb') as f:
   ...:     for line in f:
   ...:         mime, val = line.strip().split()[:2]
   ...:         d[mime] = val
   ...:         
   ...:         

In [7]: d
Out[7]: 
{'application/andrew-inset': 'ez',
 'application/applixware': 'aw',
 'application/atom+xml': 'atom',
 'application/atomcat+xml': 'atomcat',
 'application/atomsvc+xml': 'atomsvc',
 'application/ccxml+xml': 'ccxml',
 'application/cdmi-capability': 'cdmia',
 'application/cdmi-container': 'cdmic',
 'image/jpeg': 'jpeg'}

In [8]: d['image/jpeg']
Out[8]: 'jpeg'

如果你需要存储所有的项目,你可以这样做:

代码语言:javascript
复制
In [1]: d = {}

In [2]: with open('mime.txt', 'rb') as f:
   ...:     for line in f:
   ...:         line = line.strip().split()
   ...:         d[line[0]] = line[1:]
   ...:         
   ...:         

In [3]: d
Out[3]: 
{'application/andrew-inset': ['ez'],
 'application/applixware': ['aw'],
 'application/atom+xml': ['atom'],
 'application/atomcat+xml': ['atomcat'],
 'application/atomsvc+xml': ['atomsvc'],
 'application/ccxml+xml': ['ccxml'],
 'application/cdmi-capability': ['cdmia'],
 'application/cdmi-container': ['cdmic'],
 'image/jpeg': ['jpeg', 'jpg', 'jpe']}

这包括所有的MIME类型,所以如果你只想要第一个类型,你可以调用给定类型的值的第一个元素:

代码语言:javascript
复制
In [4]: d['image/jpeg'][0]
Out[4]: 'jpeg
票数 3
EN

Stack Overflow用户

发布于 2012-12-31 11:44:48

另一种方法是:

代码语言:javascript
复制
dic = {}
file =  open("filename","r")
contents = file.readlines()
for content in contents:
    value = filter(lambda a: a !='',content.split(" "))
    dic[value[0]] = value[1]
file.close()
print dic['image/jpeg']

我们用“”拆分每一行,然后删除列表中的任何“”。然后,我们将为字典赋值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14097091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档