【问题标题】:Confusion with key error python与关键错误python混淆
【发布时间】:2014-03-17 17:26:29
【问题描述】:

好的,所以我今天早些时候就此代码寻求帮助并修复了它现在我遇到了一个奇怪的错误,我需要一些建议或帮助来修复它。不断弹出的错误是

"Traceback (most recent call last):
  File "C:/Users/HatterX/Desktop/CSV_Reader_and_Writer2_vPC3", line 27, in <module>
    fr_name = frow['Franchise'].strip()
KeyError: 'Franchise'" 

任何有关如何解决此问题的帮助将不胜感激。

import csv, datetime

franchiseList = {}

with open('Franchise_Name_Scrub_List.csv', 'r') as ff:
fcf = csv.DictReader(ff)
for frow in fcf:
    franchiseList[frow['Misc Franchise Name']] = frow
for Frow in fcf:
    franchiselist[Frow['FRANCHISE Name - Directory']] = Frow

newrow={'Last Sale Date': '', 'Last Sale Amount': '', 'First Name': '', 'Last Name': '', 'Email Address': '', 'Franchise': '', 'State': '', 'Postal/Zip Code': '', 'Last Web Order ID': '', 'Date Added': '', 'Email Source':'', 'osg_web_dir': ''}
new_field_names = newrow.keys()

with open('SOR935csv_(1).csv', 'r') as f1, open('FACTS_bronto_import_add.csv', 'wb') as f2:
cf1 = csv.DictReader(f1, fieldnames=('CustNo1', 'CustNo2', 'LastOrderDate', 'LastOrderAmount', 'FirstName', 'LastName', 'UserNo', 'EmailAddress', 'Franchise', 'PrevOrderDate', 'PrevOrderAmount', 'State', 'ZIP', 'Amt1', 'Amt2', 'Amt3', 'SalesPerson', 'WEBID'))
cf2 = csv.DictWriter(f2, new_field_names)
cf2.writeheader()
for row in cf1:
    nr = newrow
    nr['Last Sale Date'] = row['LastOrderDate'].strip()
    nr['Last Sale Amount'] = row['LastOrderAmount'].strip()
    nr['First Name'] = row['FirstName'].strip()
    nr['Last Name'] = row['LastName'].strip()
    nr['Email Address'] = row['EmailAddress'].strip().split(',',1)[0]

    fr_name = frow['Franchise'].strip()
    if fr_name in franchiseList:
                nr['Franchise'] = franchiseList[fr_name]['FRANCHISE Name'].strip()
    else:
        nr['Franchise'] = 'SHOP'

    nr['State'] = row['State'].strip()
    nr['Postal/Zip Code'] = row['ZIP'].strip()
    nr['Last Web Order ID'] = row['WEBID'].strip()
    nr['Date Added'] = datetime.date.today().strftime('%m/%d/%Y')

    fr_Name = Frow['osg_web-dir'].strip()
    if fr_Name in franchiselist:
                nr['osg_web_dir'] = franchiselist[fr_Name]['FRANCHISE Name - Directory'].strip()
    else:
        nr['osg_web_dir'] = 'shop'

    #nr['osg_web_dir'] = row['SalesPerson'].strip()
    nr['Email Source'] = 'FACTSauto'
    print nr
    cf2.writerow(nr)


import csv

franchiseList = {}

with open('Franchise_Name_Scrub_List.csv', 'r') as ff:
fcf = csv.DictReader(ff)
for frow in fcf:
    franchiseList[frow['Misc Franchise Name']] = frow

newrow={'Last Sale Date': '', 'Last Sale Amount': '', 'First Name': '', 'Last Name': '', 'Email Address': '', 'Franchise': '', 'State': '', 'Postal/Zip Code': '', 'Last Web Order ID': '',  'osg_web_dir': ''}
new_field_names = newrow.keys()

with open('SOR935csv_(1).csv', 'r') as f3, open('FACTS_bronto_import_update.csv', 'wb') as f4:
cf3 = csv.DictReader(f3, fieldnames=('CustNo1', 'CustNo2', 'LastOrderDate', 'LastOrderAmount', 'FirstName', 'LastName', 'UserNo', 'EmailAddress', 'Franchise', 'PrevOrderDate', 'PrevOrderAmount', 'State', 'ZIP', 'Amt1', 'Amt2', 'Amt3', 'SalesPerson', 'WEBID'))
cf4 = csv.DictWriter(f4, new_field_names)
cf4.writeheader()
for row in cf3:
    nr = newrow
    nr['Last Sale Date'] = row['LastOrderDate'].strip()
    nr['Last Sale Amount'] = row['LastOrderAmount'].strip()
    nr['First Name'] = row['FirstName'].strip()
    nr['Last Name'] = row['LastName'].strip()
    nr['Email Address'] = row['EmailAddress'].strip().split(',',1)[0]

    fr_name = frow['Franchise'].strip()
    if fr_name in franchiseList:
                nr['Franchise'] = franchiseList[fr_name]['FRANCHISE Name'].strip()

    nr['State'] = row['State'].strip()
    nr['Postal/Zip Code'] = row['ZIP'].strip()
    nr['Last Web Order ID'] = row['WEBID'].strip()
    nr['osg_web_dir'] = row['SalesPerson'].strip()
    print nr
    cf4.writerow(nr)





#with open('SOR935csv_(1).csv', 'rb') as f1, \
#     open('FACTS_bronto_import_add.csv', 'ab') as f2:
#    for inrow in f1:
#        outrow = {
#        outrow[0] = str(inrow[2])
#        f2.write(', '.join(outrow))

【问题讨论】:

  • 您能否再次检查您的缩进是否正确?我在第一个 with 之后得到一个 IndentationError。在fr_name = frow['Franchise'].strip() 线上,您指的是frow,但您完全不在for frow in fcf 循环之外。 (这在语法上是允许的,但很少有逻辑意义)

标签: python keyerror


【解决方案1】:

我觉得行

fr_name = frow['Franchise'].strip()

应该是

fr_name = row['Franchise'].strip()
        # ^ note

frow 是代码中其他地方的 for 循环变量(并且仍将具有它在该循环中采用的最后一个值),而 row 是您当前正在处理的数据。

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 2017-02-28
    • 1970-01-01
    • 2017-01-24
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多