3

基于读取 URL 文件,我在 Python 2.7 中构建了一个带有 6 个变量的 sqlite 数据库和表。

我使用 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
4

2 回答 2

3

你在这里做什么没有意义:

insert = """insert into Tweet values ('%s', '%s', '%s', '%s', '%s', '%s')""" %("created_at", "id", "text", 'source', 'in_reply_to_user_ID', 'retweet_Count')

对文字字符串使用%-formatting 只是将每个字符串替换%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

但这仍然是一个坏主意。如果其中一个值可以包含引号会发生什么?.

想要做的是:

c.execute("insert into Tweet values (?, ?, ?, ?, ?, ?)", currentRow)

这使数据库可以处理值的格式,确保它们被正确引用等。

于 2013-11-06T20:55:39.023 回答
1

我注意到两个错误:

  • 你只检索一条推文
  • dict 的某些键拼写错误(Python 不区分大小写)

尝试这个。这不是最好的解决方案(它不断打开/关闭数据库),但它与您发布的非常相似。

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()
于 2013-11-06T21:28:32.020 回答