我有一个格式为
的文件VarName=Value
.
.
我想将其读入散列,以便H("VarName")
将返回值。
什么是快速的方式? (读取一组字符串,将所有字符串拆分为等号,然后将其放入哈希值?
我正在使用python。
答案 0 :(得分:21)
oneliner回答:
H = dict(line.strip().split('=') for line in open('filename.txt'))
(如果值也包含“=”字符,则可以选择.split()
与maxsplit=1
一起使用
答案 1 :(得分:10)
也许ConfigParser可以帮到你。
答案 2 :(得分:8)
考虑到@ Steven的回答并没有考虑属性文件中的评论和换行符,这个做了:
H = dict(line.strip().split('=') for line in open('file.properties') if not line.startswith('#') and not line.startswith('\n'))
答案 3 :(得分:7)
d = {}
with open('filename') as f:
for line in f:
key, value = line.split('=')
d[key] = value
编辑: 正如foret所建议的那样,您可以将其更改为
for line in f:
tokens = line.split('=')
d[tokens[0]] = '='.join(tokens[1:])
将处理值中允许等号的情况,但如果名称也可能具有等号,则仍然会失败 - 因为您需要一个真正的解析器。
答案 4 :(得分:3)
答案 5 :(得分:2)
csv module可让您轻松完成此操作:
import csv
H = dict([(row[0], row[1]) for row in csv.reader(open('the_file', 'r'), delimiter='=' )])
答案 6 :(得分:2)
这可能是一个愚蠢的答案,但谁知道它可以帮助你:)。
将文件的扩展名更改为.py,并进行必要的更改:
file.py
VarName="Value" # if it's a string
VarName_2=1
# and you can also assign a dict a list to a var, how cool is that ?
并将它放在你的包树或sys.path中,现在你可以在脚本中使用它来调用它:
>>> import file
>>> file.VarName
'Value'
为什么我写这个答案呢,因为,这个档案到底是什么?我从来没有看到像这样的conf文件,没有任何部分没有?为什么要创建这样的配置文件?它看起来像一个糟糕的配置文件,应该看起来像Django设置,我更喜欢使用django设置类配置文件,我尽可能。
现在你可以把你的-1放在左边:)
答案 7 :(得分:2)
对于python2,有一个jproperties https://pypi.python.org/pypi/jproperties/1.0.1
对于python2 / 3,有javaproperties http://javaproperties.readthedocs.io/en/v0.1.0/
简单如下:
import os, javaproperties
with open(file, 'rb') as f:
properties_dict = javaproperties.load(f)
答案 8 :(得分:0)
如果需要以简单的方式读取属性文件中某个部分的所有值:
您的config.properties文件布局:
[SECTION_NAME]
key1 = value1
key2 = value2
你编码:
import configparser
config = configparser.RawConfigParser()
config.read('path_to_config.properties file')
details_dict = dict(config.items('SECTION_NAME'))
这将为您提供一个字典,其中键与配置文件中的键相同及其对应的值。
details_dict becomes
{'key1':'value1', 'key2':'value2'}
现在获取key1的值:
value_1 = details_dict['key1']
将所有内容放在一个只从配置文件中读取该部分的方法中(第一次在程序运行期间调用该方法)。
def get_config_dict():
if not hasattr(get_config_dict, 'config_dict'):
get_config_dict.config_dict = dict(config.items('SECTION_NAME'))
return get_config_dict.config_dict
现在调用上面的函数并获取所需的键值:
config_details = get_config_dict()
key_1_value = config_details['key1']
答案 9 :(得分:0)
确定答案中没有其他人提到它,所以我想我会去。如果您正在编写Python并控制您的解释器,也许您可以强制使用Jython解释器。
Jython是一个完全用Java实现的Python解释器。您可以轻松获得所有Python标准库,还可以使用所有Java SE库。
我实际上没有执行过以下任何操作(想想它更像psudeo-code而没有异常处理),但是你可以混合搭配Python和Java库,你的代码最终可能会像:
from java.util import Properties
from java.io import File, FileInputStream
import os
javasPropertyObject = Properties()
pathToPropFile = os.path.join('path', 'to', 'property', 'file.properties')
if os.path.isfile(pathToPropFile):
#this is java.io.File, not Python's file descriptor
propFile = File(pathToPropFile )
javasFileInputStreamObject = FileInputStream(propFile)
javasPropertyObject.load(javasFileInputStreamObject)
#now we can pull out Java properties as defined by the .property file grammar
myProp = javasPropertyObject.getProperty('myPropName')
这样的文件有效,而不是简单的split on '='
解决方案:
myPropName1:value
myPropName2=value
myPropName3=\
value
#this is a = comment
myPropName4:my \
value
myPropNameWithUnicode=\u0009
缺点是,你失去了在不同的Python解释器之间移植的能力,现在你已经被锁定在Jython中。如果您尝试这种方法,您将被锁定在库中。我之所以喜欢Jython,是因为您可以使用所有Java SE库来增加灵活性。