python读取文件批量插入mysql数据

时间:2022-02-07 02:26:10

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


引用 2 楼 iambic 的回复:
假设你说的“一列一列的插入”是“一行一行的插入”

不好意思 打错字了,我一行一行插入,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


引用 3 楼 hucuibai 的回复:
不好意思 打错字了,我一行一行插入,cursor.executemany(sql,val)这个我知道,就是这个val的值怎么弄,我想了半天硬是想不出来,要把一行一行是数据用括号括起来,

你看下python自带文档的sqlite3,看下那个模块里的executemany是怎么用的。Python常用的数据库接口都是一样的。
当然,如果你手头有python mysql的文档可以阅读就更好了。

我只会告诉你关键字,但是不会直接告诉你解决方案。为的是让你自己搜索。
同样,也不会告诉你真正的使用方式,而是告诉你文档和大概的位置。这样才能强迫你自己去阅读文档。

如果直接告诉你答案,那么你日复一日的问那些使用google和文档就能解决的问题,有什么意思呢。

#6


引用 4 楼 hucuibai 的回复:
UnicodeDecodeError: 'utf16' codec can't decode byte 0x0a in position 112364: truncated data


你这个问题我另外一个帖子里不是已经告诉你了吗。
对于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


引用 2 楼 iambic 的回复:
假设你说的“一列一列的插入”是“一行一行的插入”

不好意思 打错字了,我一行一行插入,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


引用 3 楼 hucuibai 的回复:
不好意思 打错字了,我一行一行插入,cursor.executemany(sql,val)这个我知道,就是这个val的值怎么弄,我想了半天硬是想不出来,要把一行一行是数据用括号括起来,

你看下python自带文档的sqlite3,看下那个模块里的executemany是怎么用的。Python常用的数据库接口都是一样的。
当然,如果你手头有python mysql的文档可以阅读就更好了。

我只会告诉你关键字,但是不会直接告诉你解决方案。为的是让你自己搜索。
同样,也不会告诉你真正的使用方式,而是告诉你文档和大概的位置。这样才能强迫你自己去阅读文档。

如果直接告诉你答案,那么你日复一日的问那些使用google和文档就能解决的问题,有什么意思呢。

#6


引用 4 楼 hucuibai 的回复:
UnicodeDecodeError: 'utf16' codec can't decode byte 0x0a in position 112364: truncated data


你这个问题我另外一个帖子里不是已经告诉你了吗。
对于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。