标签归档:Python

用cx_Oracle在Python中连接Oracle数据库

1. 首先下载cx_Oracle,下载地址:http://sourceforge.net/projects/cx-oracle/
2. 下载Oracle客户端程序instantclient,下载地址(可能有变化,建议百度一下instantclient):http://www.oracle.com/technetwork/cn/database/features/instant-client/index-092699-zhs.html
3. 安装instantclient
4. cx_Oracle的使用方法参见 $Python_Home\cx_Oracle-doc\html\index.html (如:C:\Python27\cx_Oracle-doc\html\index.html)

使用过程中遇到的问题:
1. 执行import cx_Oracle 提示“找不到指定的模块”

>>> import cx_Oracle
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed: 找不到指定的模块。
>>> 
解决办法,将instantclient目录中的oci.dll拷贝到$Python_Home 或者 $Python_Home\Lib\site-packages 目录下

2. 执行import cx_Oracle 提示“DLL load failed: %1 不是有效的 Win32 应用程序”

>>> import cx_Oracle
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。
>>> 
解决办法:如果操作系统是64位系统,则拷贝64位instantclient中的oci.dll拷贝到$Python_Home 或者 $Python_Home\Lib\site-packages 目录下。
 

Python变量的复制与引用

    在python中,数据库分为可变的类型和不可变的数据类型。对于不可变的数据,复制就没有什么特别的,对于可变的数据进行复制就要注意了,因为通常我们的操作就是浅拷贝,源数据改变,所以引用的变量值都会跟着改变。好在百度中找到了这样的文章,我就直接转这里做记录了。

    简单来说,就是如果只是变量的引用(相当于增加一个别名),就直接使用 等号“= ”就可以了。否则就使用深度拷贝吧。
    深度拷贝使用的方法:

>>> from copy import deepcopy
>>> x=[[1,2],[3,4]]
>>> y=deepcopy(x)

    对于一维元组(如:[1,2,3,4])另外有个简单的方法 y=x[:] 。参见:python 元组的赋值

    字典类型类型数据的深度拷贝类似。需要注意的是它的copy方法也只是一个浅拷贝(shallow copy),和元组的[:]方法类似。

>>> from copy import deepcopy
>>> x={1:[[1,2],[3,4]]}
>>> y=deepcopy(x)
>>> x[1][0].remove(1)
>>> x
{1: [[2], [3, 4]]}
>>> y
{1: [[1, 2], [3, 4]]}
>>> 
>>> 

>>> x={1:[[1,2],[3,4]]}
>>> y=x.copy()
>>> x[1][0].remove(1)
>>> x
{1: [[2], [3, 4]]}
>>> y
{1: [[2], [3, 4]]}
>>> 

>>> 
>>> 
>>> x={1:'a',2:'b'}
>>> y=x.copy()
>>> x.pop(1)
'a'
>>> x
{2: 'b'}
>>> y
{1: 'a', 2: 'b'}
>>> 
 

参考:http://tiankonghaikuo1000.blog.163.com/blog/static/1823159720071199597313/
参考:http://www.cesclub.com/bw/jishuzhongxin/wangluokaifajishu/2011/1129/16327.html

【转】Python 十六进制与浮点数互相转换

在python中虽然很少用到十六进制或者二进制数据,但是当要处理这些数据时,
进制的转换还是必要的,这里把找到的浮点数转换为十六进制,十六进制转换为浮点数
的方法分享出来。有了十六进制数据,二进制也好,十进制,八进制也好,都很方便转换了。

1. 浮点数转为十六进制数据

>>> struct.pack("<f", 238.3).encode('hex')
'cd4c6e43'

2. 十六进制数转为浮点数

>>> import struct
>>> struct.unpack('!f', '41973333'.decode('hex'))[0]
18.899999618530273
>>> struct.unpack('!f', '41995C29'.decode('hex'))[0]
19.170000076293945
>>> struct.unpack('!f', '470FC614'.decode('hex'))[0]
36806.078125

或者

from ctypes import *

def convert(s):
    i = int(s, 16)                   # convert from hex to a Python int
    cp = pointer(c_int(i))           # make this into a c integer
    fp = cast(cp, POINTER(c_float))  # cast the int pointer to a float pointer
    return fp.contents.value         # dereference the pointer, get the float

print convert("41973333")    # returns 1.88999996185302734375E1

print convert("41995C29")    # returns 1.91700000762939453125E1

print convert("470FC614")    # returns 3.6806078125E4

转自:http://stackoverflow.com/questions/1592158/convert-hex-to-float?answertab=votes#tab-top
 
     http://stackoverflow.com/questions/10981661/float-number-to-inverse-order-hex?answertab=votes#tab-top