61

我有一个abc.txt看起来有点像的配置文件:

path1 = "D:\test1\first"
path2 = "D:\test2\second"
path3 = "D:\test2\third"

我想从中读取这些路径abc.txt以在我的程序中使用它以避免硬编码。

4

6 回答 6

111

为了使用我的示例,您的文件“abc.txt”需要如下所示。

[your-config]
path1 = "D:\test1\first"
path2 = "D:\test2\second"
path3 = "D:\test2\third"

然后在您的代码中,您可以使用配置解析器。

import ConfigParser

configParser = ConfigParser.RawConfigParser()   
configFilePath = r'c:\abc.txt'
configParser.read(configFilePath)

正如human.js他的评论中指出的那样,在 Python 3 中,ConfigParser已重命名为configparser. 有关更多详细信息,请参阅 Python 3 ImportError: No module named 'ConfigParser'

于 2013-10-15T10:47:47.103 回答
29

您的文件中需要一个部分:

[My Section]
path1 = D:\test1\first
path2 = D:\test2\second
path3 = D:\test2\third

然后,读取属性:

import ConfigParser

config = ConfigParser.ConfigParser()
config.readfp(open(r'abc.txt'))
path1 = config.get('My Section', 'path1')
path2 = config.get('My Section', 'path2')
path3 = config.get('My Section', 'path3')
于 2013-10-15T10:55:48.223 回答
15

如果您需要以简单的方式从属性文件中的某个部分读取所有值:

您的config.cfg文件布局:

[SECTION_NAME]  
key1 = value1  
key2 = value2  

你编码:

   import configparser

   config = configparser.RawConfigParser()
   config.read('path_to_config.cfg file')
    
   details_dict = dict(config.items('SECTION_NAME'))

这将为您提供一个字典,其中键与配置文件中的键及其对应的值相同。

details_dict是 :

{'key1':'value1', 'key2':'value2'}

现在获取 key1 的值: 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'] 


通用多节方法:

[SECTION_NAME_1]  
key1 = value1  
key2 = value2  

[SECTION_NAME_2]  
key1 = value1  
key2 = value2

扩展上面提到的方法,自动逐段读取,然后按段名后跟键名访问。

def get_config_section():
    if not hasattr(get_config_section, 'section_dict'):
        get_config_section.section_dict = collections.defaultdict()
        
        for section in config.sections():
            get_config_section.section_dict[section] = dict(config.items(section))
    
    return get_config_section.section_dict

访问:

config_dict = get_config_section()

port = config_dict['DB']['port'] 

(这里的“DB”是配置文件中的部分名称,“port”是“DB”部分下的键。)

于 2018-12-18T13:04:32.157 回答
3

这看起来像有效的 Python 代码,所以如果文件在项目的类路径中(而不是在其他目录或任意位置),一种方法是将文件重命名为“abc.py”并将其作为模块导入,使用import abc. 您甚至可以稍后使用该reload函数更新值。然后访问值abc.path1等。

当然,如果文件包含将要执行的其他代码,这可能会很危险。我不会在任何真正的专业项目中使用它,但对于小脚本或交互模式,这似乎是最简单的解决方案。

只需将abc.py放入与您的脚本相同的目录,或您打开交互式 shell 的目录,然后执行import abcfrom abc import *.

于 2013-10-15T10:47:37.917 回答
2

在您的情况下,一个方便的解决方案是将配置包含在一个名为的 yaml 文件中,该文件 **your_config_name.yml**如下所示:

path1: "D:\test1\first"
path2: "D:\test2\second"
path3: "D:\test2\third"

然后,在您的 python 代码中,您可以通过执行以下操作将配置参数加载到字典中:

import yaml
with open('your_config_name.yml') as stream:
    config = yaml.safe_load(stream)

然后,您可以从您的字典配置中访问例如 path1 :

config['path1']

要导入 yaml,您首先必须将软件包安装为:安装pip install pyyaml到您选择的虚拟环境中。

于 2021-01-05T15:34:04.280 回答
0

open由于您的配置文件是一个普通的文本文件,只需使用以下函数读取它:

file = open("abc.txt", 'r')
content = file.read()
paths = content.split("\n") #split it into lines
for path in paths:
    print path.split(" = ")[1]

这将打印您的路径。您还可以使用字典列表来存储它们。

path_list = []
path_dict = {}
for path in paths:
    p = path.split(" = ")
    path_list.append(p)[1]
    path_dict[p[0]] = p[1]

更多关于读/写文件的信息。希望这可以帮助!

于 2013-10-15T10:56:59.580 回答