我正试图让受让人将FIX标签值重复到一个字典键上。
我正在读取的行包含多个<269> FIX标签,它们的值不同:
<class 'list'>: ['8=FIX.X.X', '9=XXX', '35=V', '34=XXXXXX', '49=XXX.XXXXX.X', '56=XXX.XXXXX', '52=XXXXXXXX-XX:XX:XX.XXX', '128=XXXX,XXXX', '262=XXX/XXX-XXXXXXXXXX', '263=X', '265=X', '1021=X', '264=X', '267=X', '269=0', '269=1', '146=X', '55=XXX/XXX', '167=XXXXX', '1300=X', '63=X', '10=XXX']
每次我运行我的代码269:0都会被269:1覆盖我正在寻找一种将两个值附加到同一键“ 269:0,1”的方法(不幸的是找不到方法)我了解类似的问题线程)。
这是我的代码:
import os
import time
import csv
csvPath = 'C:/""/""/""/""/FixTakerLogs/'
logsPath = 'C:/""/""/""/""/FixTakerLogs/'
print('[START]:', 'MsgMarketDataRequest.csv')
fileMarketDataRequest = open('C:/Users/apanasenko/Desktop/LOGS/FixTakerLogs/MsgMarketDataRequest.log','r')
with open(csvPath + 'MsgMarketDataRequest.csv', 'w', newline='') as csvLogon:
msgDict = {'8': '','9': '','35': '','49': '','56': '','34': '','52': '','128': '','262': '','263': '','264': '',
'265': '','267': '','269': '','146': '','55': '','167': '','63': '','12008': '','64': '','193': '',
'271': '','1201': '','1202': '','1300': '','10': ''}
csvWriter = csv.DictWriter(csvLogon, msgDict.keys())
csvWriter.writeheader()
for line in fileMarketDataRequest:
line = line.rstrip()
line = line.split(';')
X = len(line) - 1
line = line[0:X]
for tag in line:
tag = tag.split('=')
msgDict[tag[0]] = tag[1]
csvWriter.writerow(msgDict)
msgDict = {}
csvLogon.close()
print('[END]:', 'MsgMarketDataRequest.csv')
谢谢。
答案 0 :(得分:0)
您也许对列表很熟悉?这是Python的可变多值存储,您可以迭代其中的所有值,依此类推。例如,您的代码可能会替换为一个
msgDict = {'8': '','9': '','35': '','49': '','56': '','34': '','52': '','128': '','262': '','263': '','264': '',
'265': '','267': '','269': '','146': '','55': '','167': '','63': '','12008': '','64': '','193': '',
'271': '','1201': '','1202': '','1300': '','10': ''}
将使用由键值列表驱动的字典理解,以使字典初始化更加紧凑(并希望更具可读性):
msg_dict = {key: '' for key in ['8', '9', '35', ... , '1'0']}
您会看到我更喜欢PEP 8中建议的命名样式,但是样式并不像开始编写工作代码那样重要-以后有很多时间来学习完善。这只是一种习惯,所以我想我提一提。
沿着相似的行(可能的话,最好总是编写可读的代码,这只是一个提示-它的工作原理与您的代码相同)
X = len(line) - 1
line = line[0:X]
使用
line = line[:-1]
当负索引可以使用时,不需要使用len
函数,但是如果您没有遇到它,那是值得了解的。
您的代码的关键部分是可读的
for tag in line:
if tag not in line:
tag = tag.split('=')
msgDict[tag[0]] = tag[1]
保证最后一次分配将覆盖任何现有密钥。但是您可以使用一个列表作为值,而不是将msg_dict
的值初始化为一个空列表,如下所示:
msg_dict = {key: [] for key in ['8', '9', '35', ... , '1'0']}
,并在找到它们时附加标签:
for tag in line:
name, val = tag.split('=')
if name in msgDict:
msgDict[name].append(val)
您会看到我使用了“拆包分配”,因此我可以使用名称而不是建立索引-同样,此类技术有助于提高可读性。遍历所有标记后,msgDict
中的每个键将是所有遇到的值的列表。
当然,您将遇到如何明智地将其写入CSV文件以便可以将其读回的问题(提示:您不必为所有内容使用CSV文件!)。但是我希望这是一个进步。祝你好运!
答案 1 :(得分:0)
尝试像这样将列表放入字典中:
>>> from collections import defaultdict
>>> msg = defaultdict(list)
>>> for key, value in [(1, 2), (3, 4), (1, 3), (3, 5)] :
... msg[key].append(value)
...
>>> dict(msg)
{1: [2, 3], 3: [4, 5]}
>>>
答案 2 :(得分:0)
下面您可以找到对我有用的代码:
import os
import time
import csv
csvPath = 'C:/'
logsPath = 'C:/'
print('[START]:', 'MsgMarketDataRequest.csv')
fileMarketDataRequest = open('C:/','r')
with open(csvPath + 'MsgMarketDataRequest.csv', 'w', newline='') as csvMarketDataRequest:
msgDict = {key: [] for key in ['8', '9', '35', '49','56','34','52','128','262','263','264','265','267','269','146','55','167','63','12008','64','193','271','1201','1202','1300','10']}
csvWriter = csv.DictWriter(csvMarketDataRequest, msgDict.keys())
csvWriter.writeheader()
for line in fileMarketDataRequest:
line = line.rstrip()
line = line.split(';')
X = len(line) - 1
line = line[0:X]
for tag in line:
name, val = tag.split('=')
if name in msgDict:
msgDict[name].append(val)
csvWriter.writerow(msgDict)
msgDict = {key: [] for key in ['8', '9', '35', '49','56','34','52','128','262','263','264','265','267','269','146','55','167','63','12008','64','193','271','1201','1202','1300','10']}
csvMarketDataRequest.close()
print('[END]:', 'MsgMarketDataRequest.csv')
谢谢您的帮助。