我在Python 3.4中使用configparser读取配置集文件时出现了一个唠叨错误。该代码最初是为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'
答案 0 :(得分: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