[python零碎笔记]python零碎

发布时间:2019-03-16 22:44:23编辑:auto阅读(2419)

    经常用到点知识,百度一下,过两天又忘,搞个笔记记一下,降低回忆成本

    1. cx_Oracle (python操作oracle数据库的接口)

    连接

    con = cx_Oracle.connect("pythondemo","welcome","192.168.188.11:1521/std1")

    con = cx_Oracle.connect(pythondemo/welcome@192.168.188.11:1521/std1)


    例子

    import cx_Oracle
    
    con = cx_Oracle.connect("pythondemo/welcome@192.168.188.11:1521/std1")
    cur = con.cursor()
    
    rows = [ (1, "First" ), (2, "Second" ),
             (3, "Third" ), (4, "Fourth" ),
             (5, "Fifth" ), (6, "Sixth" ),
             (7, "Seventh" ) ]
    
    cur.execute("truncate table mytab")
    cur.executemany("insert into mytab(id, data) values (:1, :2)", rows)
    con.commit()
    
    cur.execute('select * from mytab')
    res = cur.fetchall()
    print(res)
    
    cur.close()
    con.close()

    2.Python批量安装第三方库脚本

    BatchInstall.py
    import os
    libs = {"numpy","matplotlib","pillow","sklearn","requests",\
            "jieba","beautifulsoup4","wheel","networkx","sympy",\
            "pyinstaller","django","flask","werobot","pyqt5",\
            "pandas","pyopengl","pypdf2","docopt","pygame"}
    try:
        for lib in libs:
            os.system("pip3 install "+lib)
        print("Successful")        
    except:
        print("Failed Somehow")

    3.pandas.to_sql pandas.read_sql (pandas库与数据库双向数据流通)

    import pandas as pd
    import cx_Oracle
    
    con = cx_Oracle.connect("scott","tiger","192.168.188.11:1521/std1")
    
    d = pd.read_sql('select * from test',con)
    import numpy as np
    import pandas as pd
    a = pd.DataFrame(np.arange(10).reshape(5,2))
    a
    import sqlalchemy as sa
    oracle_db = sa.create_engine('oracle://scott:tiger@192.168.188.11:1521/std11')
    con = oracle_db.connect()
    a.to_sql(name='test',con=con,if_exists='append')

    4.request库通用爬虫框架

    import requests
    
    def getHTMLText(url):
        try:
            r = requests.get(url,timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return "产生异常"
        
    if __name__ == "__main__":
        url = "https://www.cnblogs.com/yongestcat/"
        print(getHTMLText(url))

    5.python面向对象编程

    面向对象是较函数式编程有更高的抽象层次

    多态  让你无需知道对象的类型就能调用其方法

    封装  让你无需知道对象的构造就可以使用它

    鸭子类型  像多态一样工作,但是没有继承

    属性

    方法

    继承

    对象  self指向对象本身

    实例化

    隐藏  python没有办法设置私有属性

    类的命名空间

    构造函数

    超类

    确定一个类是否是另外一个类的子类 内置方法issubclass

    知道基类 可访问__bases__属性

    知道对象是否是特定类的实例,isinstance方法,不过这通常不是好做法,依赖多态在任何情况下都是更好的选择,一种重要例外是使用抽象基类和模块abc

    知道对象属于哪个类 __class__属性

    多个超类  多重继承   方法解析顺序

    要查看对象存储的所有值 __dict__属性

    抽象基类   不能被实例化

    ABC模块

    装饰器

    文档字符串   __doc__是函数的一个属性    双下划线表示是特殊的属性

    重写方法  继承机制的重要方面

    image_thumb1


    构造函数__init__

    析构函数__del__

    super()来执行超类构造函数

    6.pythonic编程

    python有区别于其他语言的独有特性,利用这些特性的编程方法就是pythonic编程

    7.sqlalchemy库  orm接口

    SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果

    Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

    MySQL-Python
        mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
      
    pymysql
        mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
      
    MySQL-Connector
        mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
      
    cx_Oracle
        oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
      
    更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html

    使用 Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 进行数据库操作。Engine使用Schema Type创建一个特定的结构对象,之后通过SQL Expression Language将该对象转换成SQL语句,然后通过 ConnectionPooling 连接数据库,再然后通过 Dialect 执行SQL,并获取结果。

    https://www.cnblogs.com/chen1930/p/6224676.html


    import sqlalchemy as sa
    oracle_db = sa.create_engine('oracle://username:password@database')
    connection = oracle_db.connect()
    dataframe.to_sql('table_name', connection, schema='schema_name', if_exists='append', index=False)

    报错:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 1: illegal multibyte sequence  

    该报错和一下的数据库字符集毫无关系 他么的,白折腾



    select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';  或者 select userenv('language') from dual查到数据库字符集默认是US7ASCII,

    电信edp用的是AMERICAN_AMERICA.ZHS16GBK

    修改数据库服务器端US7ASCII为ZHS16GBK 

    方法1:最安全的方法是重建数据库

    进入mount阶段

    alter system enable restricted session

    drop database

    然后删除各种数据文件及对应目录即删除干净

    修改配置/etc/oratab中对应部分

    然后dbca选择正确的字符集重新建库

    xmanager 没用一次 要关掉重新设置display等才能用第二次 不然图形界面出现各种点不动的问题


    方法2:alter database character set ZHS16GBK  方式修改

    但并不总是有效。该命令在Oracle8时被引入Oracle,这个操作在本质上并不转换任何数据库字符,只是简单的更新数据库中所有跟字符集相关的信息。(意味,你只能在新字符集是旧字符集严格超集的情况下使用这种方式转换。)

    注意:转换字符集,数据库应该在RESTRICTED模式下进行. (使用DBA登录数据库)

    shutdown immediate;

    startup mount

    ALTER SYSTEM ENABLE RESTRICTED SESSION;

    ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

    ALTER SYSTEM SET AQ_TM_PROCESSES=0;

    alter database open;

    ALTER DATABASE CHARACTER SET ZHS16GBK;

    常见问题:
    问题1:
    SQL> ALTER DATABASE CHARACTER SET ZHS16CGB231280;
    ALTER DATABASE CHARACTER SET ZHS16CGB231280
    *
    ERROR at line 1:
    ORA-12712: new character set must be a superset of old character set

    或者

    ERROR at line 1:
    ORA-12721: operation cannot execute when other sessions are active


    原因:
    字符集超集问题,所谓超集是指:当前字符集中的每一个字符在新字符集中都可以表示,并使用同样的代码点,比如很多字符集都是US7ASCII的严格超集。如果不是超集,将获得以上错误。
    解决方式:
    SQL> alter database character set internal_use ZHS16GBK;
    SQL> select * from v$nls_parameters;
    SQL> SHUTDOWN IMMEDIATE;
    SQL> STARTUP;

    备注:
    ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使Oracle数据库绕过了子集与超集的校验。该方法某些方面有用处,比如测试环境;应用于产品环境大家应该格外小心,除了你以外,没有人会为此带来的后果负责。


    问题2:

    ERROR at line 1:
    ORA-12716: Cannot ALTER DATABASE CHARACTER SET when CLOB data exists

    原因:
    数据库存在CLOB类型字段,那么就不允许对字符集进行转换

    解决方式:
    这时候,我们可以去查看alert.log日志文件,看CLOB字段存在于哪些表上:

    内容如:
    ALTER DATABASE CHARACTER SET ZHS16GBK
    SYS.METASTYLESHEET (STYLESHEET) - CLOB populated
    ORA-12716 signalled during: ALTER DATABASE CHARACTER SET ZHS16GBK...
    对于用户表,可以先将该表导出,然后把该表删掉,等字符转换完毕后在导入。


    方法三: (最不安全的方法)
    修改SYS.props$表,使用"update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';" 方式更改字符集时候,只是修改了 props$ 表,只完成了十几的十二分之一的内容,存在数据完整性的隐患。(value$值输入了不正确的字符集,后果可能导致数据库无法启动。)
    只对更改后的数据有效,即数据库中原来的数据仍以原字符集被存储

    注意:
    1.修改数据库字符集时必须谨慎,修改之前一定要做数据库全量备份。(由于不能回退该项操作,因此可能会造成数据丢失或者损坏。)
    2.使用 "alter database character set ZHS16GBK;" 方式更改字符集时候,至少需要更改12张数据字典表;
    3.使用"update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';" 方式更改字符集时候,只是修改了 props$ 表,只完成了十几的十二分之一的内容,存在数据完整性的隐患。因此,更改字符集尽量使用正常的途径。
    4.设置 sql_trace 跟着后台操作:在 mount 模式(SQL> STARTUP MOUNT;)下面,把会话修改为trace模式(SQL> ALTER SESSION SET SQL_TRACE=TRUE;),可以跟着数据库的后台操作。(sql_trace是DBA的常用利器之一)
    5.实际上当我们更新了字符集,数据库启动时会根据数据库的字符集自动的来修改控制文件的字符集,如果字符集可以识别,更新控制文件字符集等于数据库字符集;如果字符集不可识别,那么控制文件字符集更新为US7ASCII。通过更新props$表的方式修改字符集,在Oracle7之后就不应该被使用

关键字