本文目录一览:
- 1、python3.6 cx_oracle连接数据库报编码错UnicodeDecodeError
- 2、python经典类和新式类为啥效率差这么多
- 3、如何写一段python代码,提取并保存txt里相应格式的内容?
python3.6 cx_oracle连接数据库报编码错UnicodeDecodeError
我说下我遇到的情况
数据库字符集是 ZHS16GBK
错误的情况是
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 12: illegal multibyte sequence
经过检查,在fetchall()获取记录时,查询到的记录里面有乱码(应该是不包含在数据库现有字符集下的字符)
临时的一个解决办法是
db=cx_Oracle.connect(dblink,encoding='UTF-8')
这样可以读取了,读取到的内容为
广州市\ue738同泰路
其中 '\ue738'应该是之前不可被读取的字符,希望对各位有帮助
python经典类和新式类为啥效率差这么多
你的测试时间差别太夸张了,肯定受到其他程序的影响,用timeit测量了一下更好。
如果all_except函数是 current != node这种,大概旧式类的对象创建和遍历加的操作是新式类对象的时间2倍。但是如果把all_except改成 while not current is node:那么旧式类对象的操作时间就比新式类少(新式类有一个descriptor的查找过程),如果给新式类增加__slots__,时间能稍微降一点,但还是比旧式类多。
所以问题应该是 != 操作没有 not is 操作高效,is操作使用了id,应该类似比较内存地址那种。而!=可能做了更多的事情。
下面是代码。
import time
class dblink:
def __init__(self,index=0):
self.index = index
self.prev = self
self.next = self
def insert(self,index):
node = dblink(index)
node.prev = self.prev
node.next = self
self.prev.next = node
self.prev = node
class nt_dblink(object):
__slots__=('index','prev','next')
def __init__(self,index=0):
self.index = index
self.prev = self
self.next = self
def insert(self,index):
node = nt_dblink(index)
node.prev = self.prev
node.next = self
self.prev.next = node
self.prev = node
def all_except(node):
current = node.next
while not current is node:
yield current
current = current.next
def test1():
head = dblink()
for i in range(100000):
head.insert(i)
for node in all_except(head):
node.index+=1
def test2():
head = nt_dblink()
for i in range(100000):
head.insert(i)
for node in all_except(head):
node.index+=1
if __name__=='__main__':
import timeit
print(timeit.timeit("test1()", setup="from __main__ import test1",number=1))
print(timeit.timeit("test2()", setup="from __main__ import test2",number=1))
如何写一段python代码,提取并保存txt里相应格式的内容?
import re
with open(input("请输入文件名:\n"), "r") as f:
content = f.read()
with open("current_txt.txt", "w") as f:
for t in re.findall("Accession: /dtdd(.+?)/dd", contents, re.S):
f.write(t)