繁体   English   中英

python:使用csv.DictReader将csv导入数据库会导致错误:DictReader实例没有属性'__getitem__'

[英]python: importing csv to db using csv.DictReader results in an Error: DictReader instance has no attribute '__getitem__'

我正在尝试使用python脚本将数据从csv文件导入sqlite数据库。

我有一个名称为NSETCS的数据库表:

import sqlite3
import csv

with open (r'F:\mypractise_python\day11\NSE-TCS.csv','r') as infile:
    content = [csv.DictReader(infile, delimiter=',')]  # read the whole file at once

try:
    db = sqlite3.connect('NSETCS')
    cursor = db.cursor()

    for line in content:
        date = line['Date']
        open_stock = float(line['Open'])
        high = float(line['High'])
        low = float(line['Low'])
        last= float(line['Last'])
        close= float(line['Close'])
        tot_trade_qt= float(line['TotTrQt'])
        turnover= float(line['Turnover (Lacs)'])
        cursor.execute('''insert into  NSETCS values (:date, :open_stock, :high, :low, :last, :close, :tot_trade_qt, :turnover)''',\
                       {'date':date, 'open_stock':open_stock, 'high':high, 'low':low, 'last':last, 'close':close,\
                     'tot_trade_qt':tot_trade_qt, 'turnover':turnover})

except Exception as E:
    print "Error:", E
else:
    db.commit()

db.close()

运行代码时,出现错误:错误:DictReader实例没有属性__getitem__

您没有在这里将内容读入列表:

content = [csv.DictReader(infile, delimiter=',')]  # read the whole file at once

那只会使读者进入列表。 使用list()代替:

content = list(csv.DictReader(infile, delimiter=','))

并不是说您需要这样做; 您可以直接在对象上循环:

reader = csv.DictReader(infile, delimiter=',')

然后

for line in reader:

缩进循环的代码,使其成为with语句的一部分,因为您需要保持文件打开状态才能读取,直到循环完成为止:

with open (r'F:\mypractise_python\day11\NSE-TCS.csv','r') as infile:
    reader = csv.DictReader(infile, delimiter=',')

    try:
        db = sqlite3.connect('NSETCS')
        cursor = db.cursor()

        for line in reader:
            # ...

我不会发现异常; 只需将连接用作上下文管理器 (就像您对文件所做的那样),以便仅在没有发生异常的情况下才提交插入:

import sqlite3
import csv

db = sqlite3.connect('NSETCS')
# use both file and database connection as context managers
with open (r'F:\mypractise_python\day11\NSE-TCS.csv','r') as infile, db:
    reader = csv.DictReader(infile, delimiter=',')
    cursor = db.cursor()
    for line in reader:
        line['turnover'] = line['Turnover (Lacs)']
        cursor.execute('''
            insert into  NSETCS values (
                :Date, :Open, :High, :Low, :Last, :Close, 
                :TotTrQt, :turnover)
            ''', line)

如果您传入float()对象或str()sqlite并不在乎。 数据库很乐意接受数字列之一。 如果不转换为float() ,则可以直接使用您的line词典,但“ Turnover (Lacs)列除外(我在词典中为此使用了别名)。 这在某种程度上简化了循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM