为 CSV 阅读器引用 Python 字典中的键

Posted

技术标签:

【中文标题】为 CSV 阅读器引用 Python 字典中的键【英文标题】:Referencing keys in a Python dictionary for CSV reader 【发布时间】:2016-12-23 01:22:10 【问题描述】:

python 新手,并尝试构建一个简单的 CSV 阅读器来创建现有工具的新交易。理想情况下,我想建立一个字典来简化设置新交易所需的参数(而不是使用 row[1]、[2]、[3] 等,我想用我的标题替换阅读起息日、交易日、价格、数量等)

我在下面创建了字典键,但无法将它们链接到我的脚本以创建新交易。我应该用什么来代替行?任何建议表示赞赏!谢谢...

代码如下:

import acm
import csv

# Opening CSV file
with open('C:\Users\Yina.Huang\Desktop\export\TradeBooking.csv', 'rb') as f:
reader = csv.DictReader(f, delimiter=',')
next(reader, None)

for row in reader:

    # Match column header with column number
    d = 
        row["Trade Time"],
        row["Value Day"],
        row["Acquire Day"],
        row["Instrument"],
        row["Price"],
        row["Quantity"],
        row["Counterparty"],
        row["Acquirer"],
        row["Trader"],
        row["Currency"],
        row["Portfolio"],
        row["Status"]
        

    NewTrade = acm.FTrade()      
    NewTrade.TradeTime = "8/11/2016 12:00:00 AM"
    NewTrade.ValueDay = "8/13/2016"
    NewTrade.AcquireDay = "8/13/2016"
    NewTrade.Instrument = acm.FInstrument[row["Instrument"]]
    NewTrade.Price = row[4]
    NewTrade.Quantity = row[5]
    NewTrade.Counterparty = acm.FParty[row[6]]
    NewTrade.Acquirer = acm.FParty[row[7]]
    NewTrade.Trader = acm.FUser[row[8]]
    NewTrade.Currency = acm.FCurrency[row[9]]
    NewTrade.Portfolio = acm.FPhysicalPortfolio[row[10]]
    NewTrade.Premium = (int(row[4])*int(row[5]))
    NewTrade.Status = row[11]

    print NewTrade
    NewTrade.Commit()

【问题讨论】:

行如何被数字索引和键引用? Row 是一个字典,所以我不确定 row[4] 将如何工作,因为 DictReader 只会使用字符串字典键。 请注意,编辑后您不再创建字典,而是创建集合。 谢谢——是的,看起来我做到了。我可以用集合和字典来完成同样的事情吗? 【参考方案1】:

csv 模块已经通过csv.DictReader 对象提供了此功能。

with open('C:\Users\Yina.Huang\Desktop\export\TradeBooking.csv', 'rb') as f:    
    reader = csv.DictReader(f)
    for row in reader:

        NewTrade = acm.FTrade()      
        NewTrade.TradeTime = row['Trade Time']
        NewTrade.ValueDay = row['Value Day']
        NewTrade.AcquireDay = row['Aquire Day']
        NewTrade.Instrument = acm.Finstrument[row['Instrument']]
        NewTrade.Price = row['Price']
        NewTrade.Quantity = row['Quantity']
        # etc

来自documentation:

创建一个像普通阅读器一样操作但映射 读入字典的信息,其键由可选参数给出 字段名参数。 fieldnames 参数是一个序列,其 元素按顺序与输入数据的字段相关联。 这些元素成为结果字典的键。如果 fieldnames 参数被省略,第一行的值 csvfile 将用作字段名。如果读取的行有更多 字段比字段名序列,剩余的数据被添加为 由 restkey 的值键控的序列。如果读取的行数较少 字段比字段名序列,其余键取值 可选的restval参数。

【讨论】:

OP 已经在使用 DictReader 但似乎代码混合了 csv.readercsv.,DictReader 代码 @Euan 在编辑之前,OP 没有使用DictReader 对不起@Euan 的混淆 - 这是正确的,我修改了我的代码以包含 DictReader。我正在尝试更新以包含相关字段并收到以下错误消息:KeyError: 'Instrument' @YinaHuang 在您的 csv 中发布前几行,包括标题。这应该可以解决问题。 @YinaHuang 重点是,你不需要新建字典,阅读器已经是字典了。但是您确实需要知道字典中的标题。我怀疑“仪器”实际上类似于“仪器”或“仪器”(末尾有一个空格)。

以上是关于为 CSV 阅读器引用 Python 字典中的键的主要内容,如果未能解决你的问题,请参考以下文章

如何从 CSV 创建字典,其中两列作为 Python 中的键 [重复]

当行内容是相关键的键值(每列的标题)时,如何用python在csv中编写嵌套字典?

快速读取所有 csv 文件并更新共享字典

如何在该字典中引用 Pandas 数据框中的键?

为字典python中的每个键选择最大值

如何在 Python 中的 Queue 对象中查找不同字典中的键?