2016-09-20 5 views
0

Я пишу программу, которая извлекает историю из базы данных истории Google Chrome и выводит ее в файл CSV. Я пытаюсь помещать информацию в несколько строк, например список URL-адресов в первой строке и заголовок веб-страницы во второй строке. Однако, когда я делаю это, я получаю следующее сообщение об ошибке:Запись нескольких списков в строки CSV в python

TypeError: декодирование Unicode не поддерживается

Любая помощь будет оценена, ниже мой код:

import sqlite3 
import datetime 
import csv 

def urls(): 
    conn = sqlite3.connect('C:\Users\username\Desktop\History.sql') 
    cursor = conn.execute("SELECT url, title, visit_count, last_visit_time from urls") 

    timestamp = row[3] 
    value = datetime.datetime(1601, 1, 1) + datetime.timedelta(microseconds=timestamp) 

    with open("C:\Users\username\Desktop\\historyulrs.csv", "ab") as filecsv: 
     filecsvwriter = csv.writer(filecsv) 
     filecsvwriter.writerow(["Url", "Title", "Visit Count", "Last visit Time"]) 

    for row in cursor: 
     with open("C:\Users\username\Desktop\\historyulrs.csv", "ab") as filecsv: 
      filecsvwriter = csv.writer(filecsv) 
      filecsvwriter.writerows([unicode(row[0], row[1]).encode("utf-8")]) 

    conn.close() 

urls() 

Я также извлечь посещать счет и время последнего посещения из базы данных, чтобы добавить к CSV. Я еще не реализовал это.

Благодаря

+0

Некоторые вещи выглядят не так. 'cursor' должен быть' conn.cursor() ', а затем вы выполняете запрос через курсор и используете' data = cursor.fetchall() 'для извлечения данных. 'timestamp = row [3]' должен вызывать ошибку, потому что 'row' не определен? Нет причин открывать CSV дважды, просто напишите свои заголовки, а затем перейдите в свой цикл 'for'. Зачем вам «юникод»? Я бы написал ответ, но я не мог быть уверен, что это сработает, потому что я ничего не знаю о вашей БД. – roganjosh

ответ

1

Использование Панды может помочь вам много с CSV-файлов:

import sqlite3 
import datetime 
import pandas 

def urls(): 
    urls = [] 
    titles = [] 
    counts = [] 
    last = [] 
    conn = sqlite3.connect('C:\Users\username\Desktop\History.sql') 
    cursor = conn.execute("SELECT url, title, visit_count, last_visit_time from urls") 

    for row in cursor: 
    #now I am just guessing 
     urls.append(row[0]) 
     titles.append(row[1]) 
     counts.append(row[2]) 
     last.append(row[3]) 

    df = pandas.DataFrame({'URL': urls, 
          'Title': titles, 
          'Visit Count': counts, 
          'Last visit Time': last}) 

    df.to_csv('historyulrs.csv', encoding='utf-8', index=False) 
    conn.close() 

urls() 

Имейте в виду, что я полностью угадали порядок следования данных в строке, и вам необходимо будет отредактировать, что в соответствии с вашими необходимо. Также я не совсем понял, зачем вам нужен datetime.

+0

Pandas может напрямую читать из sql-запросов с помощью [read_sql] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html). – Parfait

1

Ответ на этот вопрос непросто, не видя БД. Но что-то вроде этого должно работать, возможно, с небольшими изменениями в зависимости от ваших фактических данных.

import sqlite3 
import datetime 
import csv 

def urls(): 
    conn = sqlite3.connect('C:\Users\username\Desktop\History.sql') 
    c = conn.cursor() 
    query = "SELECT url, title FROM urls" 
    c.execute(query) 
    data = c.fetchall() 

    if data: 
     with open("C:\Users\username\Desktop\\historyulrs.csv", 'w') as outfile: 
      writer = csv.writer(outfile) 
      writer.writerow(['URL', 'Title']) 
      for entry in data: 
       writer.writerow([str(entry[0]), str(entry[1])]) 
Смежные вопросы