2015-09-07 51 views
0

我在Python 3.4中使用configparser读取配置文件时出现一个唠叨的错误。该代码最初是为Python 2.7编写的,但我不再使用它,我只使用python 3.4。我不希望任何向后兼容python 2.7。只有只有3.4蟒使用ConfigParser在Python中读取配置文件的错误3,4

Error reading set file ./sets/diagnostic1.set 

以上是我得到的错误,当我运行这段代码

from configparser import * 
import re, os, ctypes, csv, calendar, datetime 
from time import * 
from ctypes import * 

# Reads the config set file 
def readSetFile(file): 
    try: 
     #config = RawConfigParser() 
     #config.readfp(FakeSecHead(open(file))) # readfp is deprecated from configparser 
     config = ConfigParser(delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=';', interpolation=None) 
     config.read_file(FakeSecHead(open(file))) 
     return config 
    except: 
    return False 


# Reads fake or modified Section head in the config file 
class FakeSecHead(object): 
    def __init__(self, fp): 
     self.fp = fp 
     self.sechead = '[main]\n' 

    def readline(self): 
     if self.sechead: 
     try: 
      return self.sechead 
     finally: 
      self.sechead = None 
     else: 
     line = self.fp.readline() 
     return re.sub('^SECTION_3.*$', '[additional]', line) 

的 “diagnostic1.set” 文件,其中包含了CONFIGS

COMMENTS=Click view comments. 
    SECTION_1=################# General Settings ################# 
    FRAMEWORK_CONFIG=./experts/config/TesingConfig.xml 
    USE_ORDER_WRAPPER=0 
    UI_FONT_SIZE=12 
    UI_ERROR_INFO_COLOR=0 
    UI_CUSTOM_INFO_COLOR=0 
    SECTION_2=############## Common Strategy Settings ############## 
    OPERATIONAL_MODE=1 
    STRATEGY_INSTANCE_ID=25 
    MAX_DRAWDOWN_PERCENT=100.00000000 
    MAX_SPREAD_PIPS=100.00000000 
    ENABLE_WFO=0 
    WFO_WINDOW_SIZE=0 
    PARAMETER_SET_POOL=0.00000000 
    DISABLE_COMPOUNDING=0 
    USE_INSTANCE_BALANCE=0 
    INIT_INSTANCE_BALANCE=0.00000000 
    TIMED_EXIT_BARS=31 
    ATR_AVERAGING_PERIOD=3 
    MAX_OPEN_ORDERS=1 
    SECTION_3=############## Additional Strategy Settings ############## 
    OPEN_ATR_MULTIPLIER=0.41000000 
    OPEN_ATR_MULTIPLIER,F=1 
    OPEN_ATR_MULTIPLIER,1=0.20 
    OPEN_ATR_MULTIPLIER,2=0.01 
    OPEN_ATR_MULTIPLIER,3=0.60 
    TRADE_CONFIDENCE=2 

所以当我测试运行python 3.4控制台中的代码时,我得到“False”,表示它无法读取配置集文件。

Python 3.4.3 |Anaconda 2.3.0 (64-bit)| (default, Jun 4 2015, 15:29:08) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from configparser import * 
>>> import re, os, ctypes, csv, calendar, datetime 
>>> from time import * 
>>> from ctypes import * 
>>> 
>>> def readSetFile(file): 
...  try: 
...   #config = RawConfigParser() 
...   #config.readfp(FakeSecHead(open(file))) # readfp will be deprecated from configparser edited by developer 
...   config = ConfigParser(delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=';', interpolation=None) 
...   config.read_file(FakeSecHead(open(file))) 
...   return config 
...  except: 
...   return False 

>>> 
>>> class FakeSecHead(object): 
...  def __init__(self, fp): 
...   self.fp = fp 
...   self.sechead = '[main]\n' 
...  def readline(self): 
...   if self.sechead: 
...    try: 
...     return self.sechead 
...    finally: 
...     self.sechead = None 
...   else: 
...    line = self.fp.readline() 
...   return re.sub('^SECTION_3.*$', '[additional]', line) 
... 


>>> readSetFile('./sets/diagnostics1.set') 
False 
>>> 

任何帮助能够读取配置集文件的方式。我有相同格式的数百个配置集文件。但我似乎无法读取Python中的文件3.4

我已经成功修改了Patrick MAUPIN的代码片段,它能够读取配置集文件,但现在会在相同部分中引发关键错误代码

numSystemsInPortfolio = len(setFilePaths) 
    SettingsArrayType = numSystemsInPortfolio * ctypes.POINTER(c_double) 
    settings = SettingsArrayType() 
    for i in range(numSystemsInPortfolio): 
    settings[i] = SettingsType() 
    settings[i][IS_BACKTESTING] = True 
    settings[i][DISABLE_COMPOUNDING] = float(sets[i].mainParams["DISABLE_COMPOUNDING"]['value']) if sets[ 
     i].content.has_option('main', 'DISABLE_COMPOUNDING') else 0 
    settings[i][TIMED_EXIT_BARS] = float(sets[i].mainParams["TIMED_EXIT_BARS"]['value']) if sets[ 
     i].content.has_option('main', 'TIMED_EXIT_BARS') else 0 
    settings[i][ORIGINAL_EQUITY] = config.getfloat("account", "balance") 
    ..... 
    ..... 
    ..... 
    ..... 
    ..... 



    File "mycode.py", line 222, in main 
i].content.has_option('main', "DISABLE_COMPOUNDING") else 0 
    KeyError: 'DISABLE_COMPOUNDING' 
+1

你可以尝试调试它能走多远加入'在'readline()'后面打印(行)'。这是否告诉你问题在哪里?另外,如果你没有发现错误(使用'readSetFile'中的'try:except'),那么会抛出什么错误?你可以发布堆栈跟踪吗? –

+0

什么是'SettingsType'?问题似乎在那里。或者'mainParams'? – strubbly

回答

0

除非你的配置文件是兆字节,这是最简单的在读他们,然后对其进行修改,而不是做一个线在同一时间。而且,StringIO是将类似文件的对象传递给任何事物的最佳方式。

下面是一些代码,与该数据集的Python 3.4的工作原理:

import re 
from configparser import ConfigParser 
from io import StringIO 

# Reads the config set file 
def readSetFile(fname): 
    with open(fname, 'rb') as f: 
     data = f.read().decode('UTF-8') 

    cfg_splitter = re.compile('^SECTION_3.*$', re.MULTILINE).split 

    cfg_parser = ConfigParser(delimiters=('=', ':'), 
          comment_prefixes=('#', ';'), 
          inline_comment_prefixes=';', 
          interpolation=None) 

    data = cfg_splitter(data) 
    data.insert(1, '[additional]') 
    data.insert(0, '[main]') 
    data = '\n'.join(data) 
    print(data) 
    cfg_parser.read_file(StringIO(data)) 
    return cfg_parser 

config = readSetFile('sets/diagnostics1.set') 
for sec in config.sections(): 
    print(sec, config.items(sec)) 

print(config.has_option('main', 'DISABLE_COMPOUNDING')) 
print(config.has_option('main', 'DISABLE_COMPOUNDING2')) 

当我执行它,我得到:

main [('comments', 'Click view comments.'), ('section_1', '################# General Settings #################'), ('framework_config', './experts/config/TesingConfig.xml'), ('use_order_wrapper', '0'), ('ui_font_size', '12'), ('ui_error_info_color', '0'), ('ui_custom_info_color', '0'), ('section_2', '############## Common Strategy Settings ##############'), ('operational_mode', '1'), ('strategy_instance_id', '25'), ('max_drawdown_percent', '100.00000000'), ('max_spread_pips', '100.00000000'), ('enable_wfo', '0'), ('wfo_window_size', '0'), ('parameter_set_pool', '0.00000000'), ('disable_compounding', '0'), ('use_instance_balance', '0'), ('init_instance_balance', '0.00000000'), ('timed_exit_bars', '31'), ('atr_averaging_period', '3'), ('max_open_orders', '1')] 
additional [('open_atr_multiplier', '0.41000000'), ('open_atr_multiplier,f', '1'), ('open_atr_multiplier,1', '0.20'), ('open_atr_multiplier,2', '0.01'), ('open_atr_multiplier,3', '0.60'), ('trade_confidence', '2')] 
True 
False 
+0

配置是非常小的约25行(1.7kB)每个。嘿,帕特里克,我能比以前更进一步。它能够读取配置集文件,但会抛出如上所示的密钥错误 – JourneyMan

+0

@JourneyMan - 我认为您没有显示足够的代码来诊断这个新问题 - 我修改了答案以显示has_option在配置记录上工作... –

+0

我将它跟踪到部分带有错误(键,值)映射的代码。你的答案解决了文件阅读问题。谢谢 – JourneyMan

相关问题