2016-03-10 3 views
1

Я пытаюсь добавить список, который создается после того, как он анализирует каждую строку. Как я прохожу каждый код я получаю различные ошибкиВвод списка Python в SQLite

(C:\Users\myname\Desktop\pythonCourse>dblesson2 
Enter file name: mbox.txt 
['uct.ac.za'] 
Traceback (most recent call last): 
    File "C:\Users\myname\Desktop\pythonCourse\dblesson2.py", line 25, in  
    <module> 
    #VALUES (?, 1)''', (email,)) 
sqlite3.OperationalError: near "#VALUES": syntax error) 

, и я знаю, что это потому, что я не передавая правильные данные в базу данных, но я не могу понять это самостоятельно.

import sqlite 
import re 

conn = sqlite3.connect('emaildb.sqlite') 
cur = conn.cursor() 

cur.execute(''' 
DROP TABLE IF EXISTS Counts''') 

cur.execute(''' 
CREATE TABLE Counts (email TEXT, count INTEGER)''') 

fname = raw_input('Enter file name: ') 
if (len(fname) < 1) : fname = 'mbox-short.txt' 
fh = open(fname) 
for line in fh: 
    if not line.startswith('From: ') : continue 
    line = line.rstrip() 
    email = re.findall('@(\S+[a-zA-Z]+)', line) 
    print email 
    cur.execute('SELECT count FROM Counts WHERE email = ? ', (email)) 
    row = cur.fetchone() 
if row is None: 
    #cur.execute('''INSERT INTO Counts (email, count) 
     #VALUES (?, 1)''', (email,)) 
else : 
    cur.execute('UPDATE Counts SET count=count+1 WHERE email = ?', 
     (email,)) 
# This statement commits outstanding changes to disk each 
# time through the loop - the program can be made faster 
# by moving the commit so it runs only after the loop completes 
conn.commit() 

# https://www.sqlite.org/lang_select.html 
sqlstr = 'SELECT email, count FROM Counts ORDER BY count DESC LIMIT 10' 

print 
print "Counts:" 
for row in cur.execute(sqlstr) : 
print str(row[0]), row[1] 

cur.close()` 
+0

Добро пожаловать на переполнение стека! Не могли бы вы прояснить, в чем проблема? «Я получаю разные ошибки», это не очень полезно. Отправьте эти ошибки! Пожалуйста, найдите минутку, чтобы прочитать [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask). – Carpetsmoker

ответ

0

У вас есть ряд небольших ошибок в вашей программе. Позвольте мне попытаться их перечислить:

  • re.findall возвращает список, но вы, кажется, рассматриваете его как одну строку. Попробуйте email = email[0] рассмотреть только первый элемент списка.
  • Ваш первый отчет SELECT содержит (email). Вставка одного элемента в круглые скобки не делает его кортежем. Попробуйте (email,) или [email].
  • if после цикла for предназначен для каждой итерации цикла for, поэтому его необходимо отступом на одну остановку.
  • Корпус if не может быть пустым. Либо раскомментируйте эту операцию, либо измените ее на pass.
  • Корпус вашего финального цикла for должен быть отступом на одну точку.
  • В качестве любезности для считывателей Stack Overflow, скопируйте все автономные программы, а не только фрагменты.

Вот ваша программа после того, как я установил проблемы:

import sqlite3 
import re 

conn = sqlite3.connect(':memory:') 
cur = conn.cursor() 
cur.execute(''' 
DROP TABLE IF EXISTS Counts''') 

cur.execute(''' 
CREATE TABLE Counts (email TEXT, count INTEGER)''') 

fname = raw_input('Enter file name: ') 
if (len(fname) < 1) : fname = 'mbox-short.txt' 
fh = open(fname) 
for line in fh: 
    if not line.startswith('From: ') : continue 
    line = line.rstrip() 
    email = re.findall('@(\S+[a-zA-Z]+)', line) 
    email = email[0] 
    cur.execute('SELECT count FROM Counts WHERE email = ? ', (email,)) 
    row = cur.fetchone() 
    if row is None: 
     cur.execute('''INSERT INTO Counts (email, count) 
      VALUES (?, 1)''', (email,)) 
    else : 
     cur.execute('UPDATE Counts SET count=count+1 WHERE email = ?', 
      (email,)) 
# This statement commits outstanding changes to disk each 
# time through the loop - the program can be made faster 
# by moving the commit so it runs only after the loop completes 
conn.commit() 

# https://www.sqlite.org/lang_select.html 
sqlstr = 'SELECT email, count FROM Counts ORDER BY count DESC LIMIT 10' 

print 
print "Counts:" 
for row in cur.execute(sqlstr) : 
    print str(row[0]), row[1] 

cur.close() 
+0

Вот почему я люблю это сообщество для таких полезных людей, как вы! Я буду читать и перечитывать ваш комментарий, чтобы понять это более полно. Я ценю ваше время, которое вы потратили, чтобы помочь мне понять эту проблему. Надеюсь, в будущем я смогу расширить себя так же, как и сегодня. Еще раз спасибо :) –

0
import sqlite3 
conn=sqlite3.connect('emaildb.sqlite') 
cur=conn.cursor() 

cur.execute('''DROP TABLE IF EXISTS counts''') 
cur.execute('''CREATE TABLE counts (org TEXT, count INTEGER)''') 

f_name=raw_input('Enter file name: ') 
if len(f_name)<1 : f_name='mbox.txt' 
fn=open(f_name) 
for line in fn: 
    if not line.startswith('From: ') : continue 
    words = line.split() 
    email=words[1] 
    domain=email.split('@') 
    organiz=domain[1] 
    print organiz 
    cur.execute('SELECT count FROM Counts WHERE org=?',(organiz,)) 
    row=cur.fetchone() 
    if row==None: 
    cur.execute('''INSERT INTO counts (org, count) VALUES (?,1)''', 
    (organiz,)) 
    else: 
    cur.execute('''UPDATE counts SET count=count+1 WHERE org=?''',(organiz, 
    )) 
conn.commit() 
Смежные вопросы