2016-09-20 113 views
0

我写的是从谷歌浏览器的历史数据库,并输出到一个CSV文件中提取历史的程序。我试图将信息放在多行中,例如第一行中的URL列表和第二行中的网页标题。然而,当我这样做,我收到以下错误:写入多个列表以CSV排在python

类型错误:解码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'循环。为什么你需要'unicode'呢?我会写一个答案,但我不能确定它会工作,因为我对你的数据库一无所知。 – 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

熊猫可以直接从与SQL查询[read_sql](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html)读入。 – Parfait

1

这是不容易的,而不会看到DB回答。但是像这样的东西应该可以工作,根据您的实际数据可能会进行一些小的修改。

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])])