[英]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.