为单个字典键python分配多个值

时间:2018-07-22 07:00:55

标签: python fix-protocol

我正试图让受让人将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')

谢谢。

3 个答案:

答案 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')

谢谢您的帮助。