Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将文件转换为字典?_Python_File_Dictionary - Fatal编程技术网

Python 如何将文件转换为字典?

Python 如何将文件转换为字典?,python,file,dictionary,Python,File,Dictionary,我有一个包含两列的文件,即: 1 a 2 b 3 c 我希望将此文件读入字典,使第1列为键,第2列为值,即 d = {1:'a', 2:'b', 3:'c'} 文件很小,因此效率不是问题。这会将密钥保留为字符串: with open('infile.txt') as f: d = dict(x.rstrip().split(None, 1) for x in f) 您也可以使用类似的: 我觉得使用生成器更具Python风格(可能需要2.7+): 这还将过滤掉不以整数开头或不包含两个

我有一个包含两列的文件,即:

1 a 
2 b 
3 c
我希望将此文件读入字典,使第1列为键,第2列为值,即

d = {1:'a', 2:'b', 3:'c'}

文件很小,因此效率不是问题。

这会将密钥保留为字符串:

with open('infile.txt') as f:
  d = dict(x.rstrip().split(None, 1) for x in f)
您也可以使用类似的:


我觉得使用生成器更具Python风格(可能需要2.7+):


这还将过滤掉不以整数开头或不包含两个项目的行

如果您喜欢一行,请尝试:

d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')
输入文件=文件路径,SEP=键值分隔符字符


这不是最优雅、最有效的方法,但还是很有趣:)

这里有另一个选择

events = {}
for line in csv.reader(open(os.path.join(path, 'events.txt'), "rb")):
    if line[0][0] == "#":
        continue
    events[line[0]] = line[1] if len(line) == 2 else line[1:]

通过词典理解

d = { line.split()[0] : line.split()[1] for line in open("file.txt") }
或由熊猫制作的

import pandas as pd 
d = pd.read_csv("file.txt", delimiter=" ", header = None).to_dict()[0]
简单选项 大多数存储字典的方法都使用JSON、Pickle或行读取。如果您没有在Python之外编辑字典,那么这个简单的方法应该足以处理复杂的字典。虽然Pickle更适合大型词典

x = {1:'a', 2:'b', 3:'c'}
f = 'file.txt'
print(x, file=open(f,'w'))    # file.txt >>> {1:'a', 2:'b', 3:'c'}
y = eval(open(f,'r').read())
print(x==y)                   # >>> True

我需要从文本文件中获取值并用作键值对。我在文本文件中的内容是key=value,所以我使用了分隔符为“=”和 写了下面的代码

d = {}
file = open("filename.txt")
for x in file:
    f = x.split("=")
    d.update({f[0].strip(): f[1].strip()})


通过使用strip方法删除“=”分隔符之前或之后的任何空格,您将获得字典格式的预期数据

我认为这不是最好的方法。@Seafoid说“文件很小,因此效率不是问题。”
split()如果文件格式不正确,则
几乎不会以静默方式工作。您可以解释with语句吗?
with
用于处理文件清理。当您离开块时(通过正常执行流或异常),该文件将自动关闭。您可以在此处阅读有关Python中的上下文管理器的更多信息:
for line in open(“file.txt”):
以同样的方式进行清理。如果f是本地值,则当范围丢失时,
f
被释放。此语句唯一有用的情况是用于长函数(不利于质量),或者使用全局变量。@VGE,
用于打开的行('file.txt')
的清理方式不同。并非所有Python实现都是相同的<代码>与保证退出块时文件将关闭。当
for
行完成时,可以调用
close
CPython
会的,但是像
IronPython
这样的版本有懒惰的垃圾收集器。这里真的需要int吗?也许他希望数字是字符串?我想,一个简单的
dict([line.split()表示f中的line])
就足够了。@sukhbir:如果你读了这个问题,你会发现这不是op想要的。@silenghost:我听说op想要键作为整数,但Ignacio的解决方案(以及我删除的方案)将键作为字符串(正如伊格纳西奥自己指出的那样)。我很困惑为什么在传递dict参数时不需要[]。即
dict([x.rstrip().split(None,1)表示f中的x])
而不是
dict(x.rstrip().split(None,1)表示f中的x)
。对于那些有同样想法的人来说,前者是一个生成器表达式,而不是此处解释的列表理解:。学到了一些新东西!@peaxol:为了不创建中间列表,我们使用生成器表达式而不是列表理解。为什么不使用
分区
?和
with
语句?@SilentGhost:I d我不知道分区!但为什么在这种情况下str.split更好?关于“with”:也许您可以为我澄清一下:关闭文件描述符是否超出范围?我想在异常情况下,文件主目录仍保持打开状态,我将更改它。
分区
更快,并且正是为此目的而创建的。描述符是否关闭是实现的一个细节。
使用
是一种简单的方法为了确保它是。它仍然需要
条带
,我想说column@SamerA以上解决方案(字典理解)如果键和值都是一个单词长,则有效。如果我的文本文件包含以下数据,则有效。我如何将年份作为键,将获胜团队作为值。1903波士顿美国人1904无世界大赛1905纽约巨人1906芝加哥白袜1907芝加哥小熊1908芝加哥Cubs@Ridhi抱歉,回复太晚。您可以只在第一个空格上拆分,也可以在第一个空格上拆分e一个正则表达式作为split()@SamerAyoub的参数-谢谢。大家好,欢迎来到Stack Overflow!您的方法与其他用户不同,但是您可以编辑它以将
=
替换为一个``来回答问题吗?
events = {}
for line in csv.reader(open(os.path.join(path, 'events.txt'), "rb")):
    if line[0][0] == "#":
        continue
    events[line[0]] = line[1] if len(line) == 2 else line[1:]
d = { line.split()[0] : line.split()[1] for line in open("file.txt") }
import pandas as pd 
d = pd.read_csv("file.txt", delimiter=" ", header = None).to_dict()[0]
x = {1:'a', 2:'b', 3:'c'}
f = 'file.txt'
print(x, file=open(f,'w'))    # file.txt >>> {1:'a', 2:'b', 3:'c'}
y = eval(open(f,'r').read())
print(x==y)                   # >>> True
d = {}
file = open("filename.txt")
for x in file:
    f = x.split("=")
    d.update({f[0].strip(): f[1].strip()})