python - 生成具有多个列的.CSV-使用字典吗?

标签 python csv dictionary set

我正在编写一个脚本,以查看我的库存,并将其与所有可能的库存项目的主列表进行比较,并告诉我缺少哪些项目。我的目标是.csv文件,其中第一列包含唯一的键整数,然后其余几列将具有与该键相关的数据。例如,我的最终目标.csv文件的三行代码片段可能如下所示:

100001,apple,fruit,medium,12,red
100002,carrot,vegetable,medium,10,orange
100005,radish,vegetable,small,10,red


此数据来自多个来源。首先,对API服务器的查询为我提供了库存中物品的键列表。 2,我将.csv文件读入字典,该字典将键与所有可能键的项名称匹配。 .csv文件的前5行的代码段可能看起来像这样:

100001,apple
100002,carrot
100003,pear
100004,banana
100005,radish


请注意,如何在这两列.csv文件中找到库存清单中的任何钥匙,该文件提供了所有钥匙及其对应的项目名称,并且此清单减去我手头的库存会得到我要寻找的东西(这就是我需要的库存要得到)。

到目前为止,我可以得到一个.csv文件,其中仅包含我没有库存的项目的键和项目名称。给出这样的库存清单:

100003,100004


我生成的.csv文件的片段如下所示:

100001,apple
100002,carrot
100005,radish


这意味着我的库存中有梨和香蕉(因此不在此.csv文件中。)

为了得到这个,当给定一个如下所示的项目ID时,我有一个函数来获取项目名称:

def getNames(id_to_name, ids):
    return [id_to_name[id] for id in ids]


然后是一个从清单服务器API调用中以整数形式给出键列表的函数,该函数返回一个列表,并且我已经像下面这样运行此函数:

invlist = ServerApiCallFunction(AppropriateInfo)


第三个函数将这个invlist作为其输入,并返回键(项目ID)和我没有的项目名称的字典。还将此字典的信息写入.csv文件。我正在使用set1-set2方法来执行此操作。看起来像这样:

def InventoryNumbers(inventory):
    with open(csvfile,'w') as c:
        c.write('InvName' + ',InvID' + '\n')
    missinginvnames = []
    with open("KeyAndItemNameTwoColumns.csv","rb") as fp:
        reader = csv.reader(fp, skipinitialspace=True)
        fp.readline() # skip header
        invidsandnames = {int(id): str.upper(name) for id, name in reader}
    invids = set(invidsandnames.keys())
    invnames = set(invidsandnames.values())
    invonhandset = set(inventory)
    missinginvidsset = invids - invonhandset
    missinginvids = list(missinginvidsset)
    missinginvnames = getNames(invidsandnames, missinginvids)
    missinginvnameswithids = dict(zip(missinginvnames, missinginvids))
    print missinginvnameswithids
    with open(csvfile,'a') as c:
        for invname, invid in missinginvnameswithids.iteritems():
            c.write(invname + ',' + str(invid) + '\n')

    return missinginvnameswithids


然后我这样称呼它:

InventoryNumbers(invlist)


有了这样的解释,现在在这里我的问题。我想通过添加其他列来扩展此输出.csv文件中的数据。此数据将从另一个.csv文件中提取,该文件的片段如下所示:

100001,fruit,medium,12,red
100002,vegetable,medium,10,orange
100003,fruit,medium,14,green
100004,fruit,medium,12,yellow
100005,vegetable,small,10,red


请注意,它不包含项目名称(因此我必须从另一个只有键和项目名称两列的.csv文件中提取该名称),但是它确实使用相同的密钥。我正在寻找一种方法来引入这些额外的信息,以便最终的.csv文件不仅会告诉我我没有库存的物品的钥匙(即物品ID)和物品名称,而且还将类型,大小,数字和颜色的列。

我看过的一个选项是收藏集中的defaultdict片段,但是我不确定这是否是实现我想要做的最好的方法。如果确实使用了此方法,则不确定如何调用它来达到所需的结果。如果使用其他方法更简单,我当然也愿意尝试。

如何获取我库存中没有的项目的键和相应项目名称的字典,并以可以将其全部输出到.csv文件的方式向其添加这些额外信息?

编辑:当我键入此内容时,我想到我可能会通过创建一个新的.csv文件来简化自己的工作,该文件的日期应为键,项目名称,类型,大小,数字,颜色(基本上只是复制)在项目名称列中的.csv中,该名称已经具有每个键的其他信息。)这样,我只需要从一个.csv文件中绘制,而不是从两个文件中绘制。即使我这样做了,我将如何仅基于那些不在库存中的项的密钥来创建所需的.csv文件呢?

解答:我又发布了一个关于如何实施我接受的解决方案的问题here(因为它给我一个值错误,因为我的dict值是字符串而不是开头的集合),最终我决定要一个列表而不是一个列表一组(以保留顺序)。我还最终将带有项目名称的列添加到了具有所有其他数据的.csv文件中,因此我只需要从一个.csv文件中进行绘制即可。就是说,这部分代码现在看起来像这样:

MyDict = {}
infile = open('FileWithAllTheData.csv', 'r')
for line in infile.readlines():
    spl_line = line.split(',')
    if int(spl_line[0]) in missinginvids: #note that this is the list I was using as the keys for my dict which I was zipping together with a corresponding list of item names to make my dict before.
        MyDict.setdefault(int(spl_line[0]), list()).append(spl_line[1:])
print MyDict

最佳答案

听起来您需要的是将int映射到集合的dict,即

MyDict = {100001: set([apple]), 100002: set([carrot])}

您可以添加更新:

MyDict[100001].update([fruit])

这会给你:{100001: set([apple, fruit]), 100002: set([carrot])}

另外,如果您有胡萝卜的属性列表... [vegetable,orange]

你可以说MyDict[100002].update([vegetable, orange])

并得到:{100001: set([apple, fruit]), 100002: set([carrot, vegetable, orange])}

这回答了你的问题了吗?

编辑:

读入CSV ...

infile = open('MyFile.csv', 'r')
for line in infile.readlines():
    spl_line = line.split(',')
    if int(spl_line[0]) in MyDict.keys():
        MyDict[spl_line[0]].update(spl_line[1:])

关于python - 生成具有多个列的.CSV-使用字典吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13282278/

相关文章:

python - 按行和列写入 csv

python - 在 Python 中声明一个数字。可能强调千?

支持多个解密 key 的Python加密方案

python - 如何更改Python3中ssl模块中的 'cafile'参数?

arrays - 如何获取远程服务器主机名作为变量并使用它?

dictionary - Maxima语言是否具有map/dictionary数据结构,如果有,则如何启动它以及如何访问其值和键?

python - 带有 memcached : how to make it work? 错误的 Pyramid - MissingCacheParameter:需要 url

java - 使用Weka : Can Training Data be of Multiple Length?

javascript - D3 中的两个 csv http URL 数据相同的图表

dictionary - 在 Swift 中,将两个数组分配给字典的键/值的最佳方法是什么?