简体   繁体   English

在python 3,4中使用ConfigParser读取配置文件时出错

[英]Errors reading a config file with ConfigParser in python 3,4

I am having a nagging error in Python 3.4 reading a config set file using the configparser . 我在python 3.4中使用configparser读取配置集文件时遇到na的错误。 The Code was originally written for Python 2.7 but i no longer use it and i only use python 3.4 . 该代码最初是为Python 2.7编写的,但我不再使用它,而仅使用python 3.4。 I don't want any backward compatibility to python 2.7 at all. 我根本不希望与python 2.7有任何向后兼容性。 Only and only python 3.4 只有Python 3.4

Error reading set file ./sets/diagnostic1.set

Above is the Error i am getting , when i run this code 以上是我运行此代码时遇到的错误

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)

The " diagnostic1.set " file which contains the configs 包含配置的“ diagnostic1.set”文件

  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

So when i tested Running the code in python 3.4 console i get "False" which indicates it can't read the config set file. 因此,当我测试在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
 >>> 

Any help in being able to read the config set file the way it is. 能够以任何方式读取配置集文件的任何帮助。 i have hundreds of config set files in the same format. 我有数百个相同格式的配置集文件。 but i can't seem to be able to read the files in Python 3.4 但我似乎无法读取Python 3.4中的文件

I have managed to modify code snippet from Patrick MAUPIN and it is able to read the config set file but now throws an key error in same part of the code 我已经设法从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'

Unless your config files are megabytes, it's easiest to read them in and then modify them rather than doing it a line at a time. 除非您的配置文件为兆字节,否则最简单的方法是读取它们然后修改它们,而不是一次写一行。 Also, StringIO is the best way to pass a file-like object to, well, anything. 同样,StringIO是将类似文件的对象传递给任何东西的最佳方法。

Here is some code that works with that dataset for Python 3.4: 这是一些适用于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'))

When I execute it, I get: 当我执行它时,我得到:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM