[英]Errors reading a config file with ConfigParser in python 3,4
我在python 3.4中使用configparser讀取配置集文件時遇到na的錯誤。 該代碼最初是為Python 2.7編寫的,但我不再使用它,而僅使用python 3.4。 我根本不希望與python 2.7有任何向后兼容性。 只有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”文件
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'
除非您的配置文件為兆字節,否則最簡單的方法是讀取它們然后修改它們,而不是一次寫一行。 同樣,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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.