import os
import MySQLdb
def onlineinsert(line,database):
try:
conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',db=database)
except:
pass
cursor=conn.cursor()
sql='insert ignore into onlinetimerecord(PlayerID,AccountID,ClientType,OnlineTime,OfflineTime,LoginIP,DiamondLogin,DiamondLogoff) values(%s)'%(line)
print sql
cursor.execute(sql)
dir='f:\\123'
for a,b,c in os.walk(dir):
for i in c:
if i[-3:]=='txt':
os.chdir(a)
path=os.getcwd()
file=os.path.join(path,i)
baselist=path.split('\\')
database=baselist[2]
if i[0:6]=='online':
f=open(file,'rb')
for line in f.read().decode('utf-16le').split('\n'):
onlineinsert(line,database)
我刚学python,请教一下,我这个只能一列一列的插入,要是批量插入的话,要怎么写呢?
6 个解决方案
#1
executemany
#2
假设你说的“一列一列的插入”是“一行一行的插入”
#3
不好意思 打错字了,我一行一行插入,cursor.executemany(sql,val)这个我知道,就是这个val的值怎么弄,我想了半天硬是想不出来,要把一行一行是数据用括号括起来,
#4
val=[]
for line in f.read().decode('utf-16le').split('\n'):
num='('+line+')'
val.append(num)
这样报错
Traceback (most recent call last):
File "F:\testmodule.py", line 27, in <module>
for line in f.read().decode('utf-16le').split('\n'):
File "C:\Python27\lib\encodings\utf_16_le.py", line 16, in decode
return codecs.utf_16_le_decode(input, errors, True)
UnicodeDecodeError: 'utf16' codec can't decode byte 0x0a in position 112364: truncated data
#5
你看下python自带文档的sqlite3,看下那个模块里的executemany是怎么用的。Python常用的数据库接口都是一样的。
当然,如果你手头有python mysql的文档可以阅读就更好了。
我只会告诉你关键字,但是不会直接告诉你解决方案。为的是让你自己搜索。
同样,也不会告诉你真正的使用方式,而是告诉你文档和大概的位置。这样才能强迫你自己去阅读文档。
如果直接告诉你答案,那么你日复一日的问那些使用google和文档就能解决的问题,有什么意思呢。
#6
你这个问题我另外一个帖子里不是已经告诉你了吗。
对于utf-16le文档,是不能用文本方式打开再readline的。
举个例子,文本的“逻辑内容”是u'a\nb',那么用utf-16le编码,文本里真正的数据是'a\x00\n\x00b\x00'。那么你用文本模式打开,然后用readlines去读,因为readlines是用'\n'分割的,读进来的数据分行之后就成了['a\x00\n', '\x00b\x00'],这个'\n\x00'本来是一个字符,去被拆开了,就不再是健康的utf-16le字符串了。
所以别用readlines;自己先read,全部用utf-16le解码,然后自己split。
#1
executemany
#2
假设你说的“一列一列的插入”是“一行一行的插入”
#3
不好意思 打错字了,我一行一行插入,cursor.executemany(sql,val)这个我知道,就是这个val的值怎么弄,我想了半天硬是想不出来,要把一行一行是数据用括号括起来,
#4
val=[]
for line in f.read().decode('utf-16le').split('\n'):
num='('+line+')'
val.append(num)
这样报错
Traceback (most recent call last):
File "F:\testmodule.py", line 27, in <module>
for line in f.read().decode('utf-16le').split('\n'):
File "C:\Python27\lib\encodings\utf_16_le.py", line 16, in decode
return codecs.utf_16_le_decode(input, errors, True)
UnicodeDecodeError: 'utf16' codec can't decode byte 0x0a in position 112364: truncated data
#5
你看下python自带文档的sqlite3,看下那个模块里的executemany是怎么用的。Python常用的数据库接口都是一样的。
当然,如果你手头有python mysql的文档可以阅读就更好了。
我只会告诉你关键字,但是不会直接告诉你解决方案。为的是让你自己搜索。
同样,也不会告诉你真正的使用方式,而是告诉你文档和大概的位置。这样才能强迫你自己去阅读文档。
如果直接告诉你答案,那么你日复一日的问那些使用google和文档就能解决的问题,有什么意思呢。
#6
你这个问题我另外一个帖子里不是已经告诉你了吗。
对于utf-16le文档,是不能用文本方式打开再readline的。
举个例子,文本的“逻辑内容”是u'a\nb',那么用utf-16le编码,文本里真正的数据是'a\x00\n\x00b\x00'。那么你用文本模式打开,然后用readlines去读,因为readlines是用'\n'分割的,读进来的数据分行之后就成了['a\x00\n', '\x00b\x00'],这个'\n\x00'本来是一个字符,去被拆开了,就不再是健康的utf-16le字符串了。
所以别用readlines;自己先read,全部用utf-16le解码,然后自己split。