0x92
即 10010010
,UTF8 中编码一个字符的第一个字节(start byte)只可能是 0xxxxxxx
、110xxxxx
、1110xxx
、11110xxx
……而后面的字节只可能是 10xxxxxx
。也就是说 0x92
只能作为后面的字节,却出现在了第一个字节的位置。
出现这种问题绝大部分情况是因为文件不是 UTF8 编码的(例如,可能是 GBK 编码的),而系统默认采用 UTF8 解码。解决方法是改为对应的解码方式。
极少数情况是因为文件损坏了或者和一部分非 UTF8 编码混在一起,可以修复文件或采用 replace
等方式解码。
Python 2 没有问题是因为 Python 2 默认以字节流(对应 Python 3 的 bytes
)的方式读文件,不像 Python 3 默认解码为 unicode
,把读文件的方式改为 rb
有同样的效果,不过 Python 3 中处理 bytes
还可能遇到很多问题就是了……
此种方式报错 UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xea in position 3171: invalid c
with open(childrenFile + "\\" + childrenFile_00,"r", "utf-8") as f:
则尝试下面这种方式,解释如上
with open(childrenFile + "\\" + childrenFile_00,"rb") as f:
python3 读取文件 写入库
/*******************************************************************************************************/
#coding:utf-8
from imp import reload
import pymysql
import time
import json
import datetime
import requests
import urllib
import datetime
import getopt
import random
import xlwt
import os
import sys
import codecs
reload(sys)
if os.path.exists(‘logs‘)==False:
os.mkdir(‘logs‘)
config={‘host‘:‘127.0.0.1‘,
‘user‘:‘root‘,
‘password‘:‘root‘,
‘port‘:3306 ,
‘database‘:‘test‘,
‘charset‘:‘utf8‘
}
conn= pymysql.connect(**config)
cur=conn.cursor()
path = ‘F:\BreachCompilation\data‘
files = os.listdir(path)
for file in files :
childrenFile = path + "\\" + file
files_00 = os.listdir(childrenFile)
for childrenFile_00 in files_00 :
with open(childrenFile + "\\" + childrenFile_00,"rb") as f:
ftextlist = f.readlines()
start = 0
for line in ftextlist:
##content_0 = ftextlist.split("\n")
element = line.decode("utf-8").split(":")
start = start + 1
print("-------索引------" + str(start))
if( len(element) >= 2 ):
print("邮箱" + element[0] + "密码:" + element[1])
insertSQL = "insert into 40G (uname, pwd) value(‘%s‘, ‘%s‘)" % (pymysql.escape_string(element[0]), pymysql.escape_string(element[1]))
cur.execute(insertSQL)
conn.commit()
##element = content.split(":")
##print(element[0] + "----" + element[1])
##insertSQL = "insert into 40G (uname, pwd) value(‘%s‘, ‘%s‘)" % (element[0], element[1])
print("over")
##cur.close()
##conn.close()
/**********************python3 当 \x 需要转义 转义为 \/x**************************************************************************/
#coding:utf-8
from imp import reload
import pymysql
import time
import json
import datetime
import requests
import urllib
import datetime
import getopt
import random
import xlwt
import os
import sys
import codecs
reload(sys)
if os.path.exists(‘logs‘)==False:
os.mkdir(‘logs‘)
config={‘host‘:‘127.0.0.1‘,
‘user‘:‘root‘,
‘password‘:‘root‘,
‘port‘:3306 ,
‘database‘:‘test‘,
‘charset‘:‘utf8‘
}
conn= pymysql.connect(**config)
cur=conn.cursor()
path = ‘E:\/xunleixiazai\BreachCompilation\data‘
files = os.listdir(path)
for file in files :
childrenFile = path + "\\" + file
files_00 = os.listdir(childrenFile)
for childrenFile_00 in files_00 :
with open(childrenFile + "\\" + childrenFile_00,"rb") as f:
ftextlist = f.readlines()
start = 0
for line in ftextlist:
##content_0 = ftextlist.split("\n")
element = line.decode("utf-8").split(":")
start = start + 1
print("-------索引------" + str(start))
if( len(element) >= 2 ):
print("邮箱" + element[0] + "密码:" + element[1])
insertSQL = "replace into 40G (uname, pwd) value(‘%s‘, ‘%s‘)" % (pymysql.escape_string(element[0]), pymysql.escape_string(element[1]))
cur.execute(insertSQL)
conn.commit()
##element = content.split(":")
##print(element[0] + "----" + element[1])
##insertSQL = "insert into 40G (uname, pwd) value(‘%s‘, ‘%s‘)" % (element[0], element[1])
print("over")
##cur.close()
##conn.close()