我在Python 2.7中构建了一个带有6个变量的sqlite数据库和表,基于读取URL文件。
我使用了JSON并创建了一个字典。代码读取所有内容并循环遍历键和值。
我需要将它插入到我的表中。这就是我有点失落的地方。我将提供代码,我认为我的洞是显而易见的。
import json
import urllib2
#Read file and print a line
webFD=urllib2.urlopen("http://rasinsrv07.cstcis.cti.depaul.edu/CSC455/assignment4.txt")
tweet = webFD.readline()
tweet
#create dictionary
dictt=json.loads(tweet)
#print dictionary
dictt.keys()
#print values
dictt.values()
#loop through tweets
for (key, value) in dictt.items():
print key, '->', value
#Created the DB
import sqlite3
conn = sqlite3.connect('twitter.db')
c = conn.cursor()
#Created the table for the tweets
c.execute("CREATE TABLE Tweet(created_at, id, text, source, in_reply_to_user_ID,retweet_Count)")
这是我的脱节。想要加载这些推文(dict中的6个键和值到Tweet表中:
for elt in tweet:
currentRow = elt[:-1].split(", ")
insert = """insert into Tweet values ('%s', '%s', '%s', '%s', '%s', '%s')""" %("created_at", "id", "text", 'source', 'in_reply_to_user_ID', 'retweet_Count')
print insert
答案 0 :(得分:3)
你在这里做的事没有意义:
insert = """insert into Tweet values ('%s', '%s', '%s', '%s', '%s', '%s')""" %("created_at", "id", "text", 'source', 'in_reply_to_user_ID', 'retweet_Count')
使用%
- 使用文字字符串进行格式化只会将每个%s
替换为文字字符串。所以你会得到这个:
insert into Tweet values ('created_at', 'id', 'text', 'source', 'in_reply_to_user_ID', 'retweet_Count')
这显然是胡说八道;您要插入值,而不是列名称。
你可以 - 但是不应该通过将六个值放入%
操作来解决这个问题,如下所示:
insert = """insert into Tweet values ('%s', '%s', '%s', '%s', '%s', '%s')""" % currentRow
但这仍然是一个坏主意。如果其中一个值中有一个引用,会发生什么? This
您想要做的是:
c.execute("insert into Tweet values (?, ?, ?, ?, ?, ?)", currentRow)
这使数据库可以处理格式化值,确保它们被正确引用等等。
答案 1 :(得分:1)
我注意到两个错误:
试试这个。这不是最好的解决方案(它会一直打开/关闭数据库),但它与您发布的解决方案非常相似。
import json
import urllib2
#Read file and print a line
webFD = urllib2.urlopen("http://rasinsrv07.cstcis.cti.depaul.edu/CSC455/assignment4.txt")
tweets = webFD.readlines()
for tweet in tweets:
print tweet
#create dictionary
try:
dictt = json.loads(tweet)
except ValueError:
continue
#print dictionary
print dictt.keys()
#print values
print dictt.values()
#loop through tweets
for (key, value) in dictt.items():
print key, '->', value
#Created the DB
import sqlite3
conn = sqlite3.connect('twitter.db')
c = conn.cursor()
#Created the table for the tweets
c.execute("CREATE TABLE IF NOT EXISTS Tweet(created_at, id, text, source, in_reply_to_user_ID,retweet_Count)")
#*** Here is a possible solution ***
c.execute('INSERT INTO Tweet VALUES (?, ?, ?, ?, ?, ?)',
(dictt['created_at'], dictt["id"], dictt["text"], dictt['source'], dictt['in_reply_to_user_id'],
dictt['retweet_count']))
conn.commit()
conn.close()