Python 将.csv导入SQL

Python 将.csv导入SQL,python,sql,csv,Python,Sql,Csv,我正在尝试使用CSV,以便使用Python填充34列SQL数据库,尽管我不能 import csv sqlite3 con = sqlite3.connect(":memory:") cur = con.cursor() cur.execute("CREATE TABLE t (No, Source, Host, Link, Date, Time, time2, Category, AuthorId, AuthorName, AuthorUrl, Auth, Followers, Follow

我正在尝试使用CSV,以便使用Python填充34列SQL数据库,尽管我不能

import csv sqlite3
con = sqlite3.connect(":memory:")
cur = con.cursor()

cur.execute("CREATE TABLE t (No, Source, Host, Link, Date, Time, time2, Category, AuthorId, AuthorName, AuthorUrl, Auth, Followers, Following, Age, Gender, Language, Country, Province, City, Location, Sentiment, Title, Snippet, Description, Tags, Contents, View, Comments, Rating, Favourites, Duration, Bio, UniqueId);")}

with open('database.csv', 'rb') as fin:
    dr = csv.reader(fin) 
    dicts = ({'No': line[0], 'Source': line[1], 'Host': line[2], 'Link': line[3], 'Date': line[4], 'Time': line[5], 'time2': line[6], 'Category': line[7], 'AuthorId': line[8], 'AuthorName': line[9], 'AuthorUrl': line[10], 'Auth': line[11], 'Followers': line[12], 'Following': line[13], 'Age': line[14], 'Gender': line[15], 'Language': line[16], 'Country': line[17], 'Province': line[18], 'City': line[19], 'Location': line[20], 'Sentiment': line[21], 'Title': line[22], 'Snippet': line[23], 'Description': line[24], 'Tags': line[25], 'Contents': line[26], 'View': line[27], 'Comments': line[28], 'Rating': line[29], 'Favourites': line[30], 'Duration': line[31], 'Following': line[32], 'UniqueId': line[33]} for line in dr)
    to_db = ((i['No'], i['Source'], i['Host'], i['Link'], i['Date'], i['Time'], i['time2'], i['Category'], i['AuthorId'], i['AuthorName'], i['AuthorUrl'], i['Auth'], i['Followers'], i['Following'], i['Age'], i['Gender'], i['Language'], i['Country'], i['Province'], i['City'], i['Location'], i['Sentiment'], i['Title'], i['Snippet'], i['Description'], i['Tags'], i['Contents'], i['View'], i['Comments'], i['Rating'], i['Favourites'], i['Duration'], i['Bio'], i['UniqueId']) for i in dicts)

cur.executemany("INSERT INTO t VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", to_db)
con.commit()
虽然这是我第一次做蟒蛇,但我一直在遵循许多指示,我不知道如何做

你能帮我做这个吗?非常感谢你的帮助


Pd:如果无法推断,csv文件没有标题,我正在尝试一列一列地填充。

如果csv元素的位置正确,您不能做一些更直接的操作,例如使用以下数据

1,2,3
a,b,c
使用以下命令:

import sqlite3
con = sqlite3.connect(":memory:")
cur = con.cursor()

cur.execute("CREATE TABLE t (col1,col2,col3);")

with open('database.csv', 'rb') as fp:
    for line in fp.readlines():
        cur.execute("INSERT INTO t VALUES (?, ?, ?)",line.strip().split(','))
con.commit()

for row in cur.execute("select * from t;"):
    print row

这很有效。我用了几条捷径来节省打字时间

import csv
import sqlite3
import itertools

params = ['No', 'Source', 'Host', 'Link', 'Date', 'Time', 'time2', 'Category', 'AuthorId', 'AuthorName', 'AuthorUrl', 'Auth', 'Followers', 'Following', 'Age', 'Gender', 'Language', 'Country', 'Province', 'City', 'Location', 'Sentiment', 'Title', 'Snippet', 'Description', 'Tags', 'Contents', 'View', 'Comments', 'Rating', 'Favourites', 'Duration', 'Bio', 'UniqueId']

create_str = "CREATE TABLE t (%s);" % ', '.join('"%s"' % p for p in params)
insert_str = "INSERT INTO t VALUES (%s)" % ', '.join(itertools.repeat('?', len(params)))

with open('database.csv') as fin:
    dr = csv.DictReader(fin, fieldnames=params, skipinitialspace=True)
    lst = [tuple(d[p] for p in params) for d in dr]

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute(create_str)

cur.executemany(insert_str, lst)
con.commit()

for row in cur.execute("select * from t;"):
    print(row)
请注意,使用字符串格式操作构建sql查询字符串是一种不好的做法。如果与未知输入数据一起使用,则可能导致sql注入攻击。我在这里这样做是因为字符串只根据已知值和未知输入生成,而文件中的未知输入是使用标准的“?”占位符正确生成的,并将元组传递给execute方法


请注意,一个表中的参数太多。应该在多个表中更加规范化,但我想你会在某个时候了解到这一点。

在什么方面出错了?您能否提供一个简单的输入数据示例,以便我们了解您面临的问题?您的代码看起来非常混乱,34列对于一个表来说似乎太多了:顺便说一句,如果您在导入这些数据时需要应用一些逻辑,Python是完美的,但是如果您只需要原始导入,那么许多DBMS都支持这一功能。我想知道为什么在使用了你的代码之后,存在此错误:除非使用可以解释8位bytestring(如text_factory=str)的text_工厂,否则不能使用8位bytestring。强烈建议您只将应用程序切换到Unicode字符串。简单的答案是不要以二进制模式打开文件。我调整了我的答案。这只是Python3中的一个问题。