python手记(5)

本博客所有内容是原创,未经书面许可,严禁任何形式的转

http://blog.csdn.net/u010255642


python中文乱码解决

首先来看Python (command line)环境

先生成unicode字符

>>> ss=u"武器"

>>> ss
u'\u6b66\u5668'
>>> sss=u'武器'
>>> sss
u'\u6b66\u5668'

>>>

然后是普通字符

>>> s="武器"
>>> s
'\xce\xe4\xc6\xf7'
>>>

出现了中文乱码

我们通过print语句可以将它们输出,但问题仍没有解决

>>> print s
武器
>>> print ss
武器
>>> print sss
武器

判断字符串的类型是否为unicode类型

>>> isinstance( s, str )
True
>>> isinstance( s, unicode)
False
>>>

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。

我们先处理非unicode字符,解码为utf-16格式,也可以解码成gbk格式

>>> x=s.decode('gbk')
>>> x
u'\u6b66\u5668'


>>> s
'\xce\xe4\xc6\xf7'
>>> s.decode("utf-16")
u'\ue4ce\uf7c6'
>>>

 >>> print x
武器

此外可以使用形如下面的unicode函数来转换

unicode(s, "gbk")

>>> x=unicode(s,'gbk')
>>> x
u'\u6b66\u5668'
>>> print x

武器


在ubuntu上安装PostgreSQL

sudo apt-get install -y postgresql-9.1postgresql-client-9.1 postgresql-contrib-9.1postgresql-server-dev-9.1

PostgreSQL登录(使用psql客户端登录)

使用postgres 用户登录的意思
 sudo -u postgres psql       
PostgreSQL数据默认会创建一个postgres的数据库用户作为数据库的管理员,密码是随机的,所以这里设定为'postgres'
修改PostgreSQL登录密码:
postgres=# ALTER USERpostgres WITH PASSWORD 'postgres';
         //postgres=#为PostgreSQL下的命令提示符
        4.退出PostgreSQLpsql客户端
        postgres=# \q



修改linux系统的postgres用户的密码(密码与数据库用户postgres的密码相同)
 

删除和修改PostgreSQL用户密码
sudo passwd -d postgres
PostgreSQL数据默认会创建一个linux用户postgres,修改密码

sudo -u postgres passwd
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:
passwd:已成功更新密码
在数据库服务器上用postgres帐号通过psql或者pgAdmin等等客户端操作数据库了。

/etc/init.d/postgresql restart


文件系统级别备份(冷备份)
文件系统级别的备份是冷备份,需要停止数据库。
1 ,停止数据库
pg_ctl –D /usr/local/pgsql/data stop
2 ,备份数据库
tar –jcv –f /usr/local/pgsql/backup/filesystem.tar.bz2 /usr/local/pgsql/data/
3 ,删除 /usr/local/pgsql/data/ 目录

rm –r /usr/local/pgsql/data/
4 ,解压备份文件到原目录
tar –jxv –f /usr/local/pgsql/backup/filesystem.tar.bz2 –C /
5 ,启动数据库
pg_ctl –D /usr/local/pgsql/data start
6 ,查看数据库 pg1 是否恢复
psql pg1
pg=# select * from tb1;
a
---
1

(1 rows)

PostgreSQL pg_hba.conf 文件


pg_hba.conf是设置访问认证的主要文件,格式为每条记录一行,每行指定一条访问认证。设定一条访问认证包含了7个部分:连接方式(type)、数据库(database)、用户名(user)、ip地址(ip-address)、子网掩码(ip-mask)、认证方法(authentication method)、认证配置(authentication-option),以下是这7个部分的详细说明: 

连接方式(type) 

连接方式共有三种:local、host、hostssl 

local 

这条记录匹配通过 Unix 域套接字进行的联接企图, 没有这种类型的记录,就不允许 Unix 域套接字的联接。 

host 

这条记录匹配通过 TCP/IP 网络进行的联接尝试,请注意,除非服务器是 带着 -i 选项或者打开了 postgresql.conf 里面的 tcpip_socket 配置参数集启动的,否则 TCP/IP 联接是被禁止掉的。 

hostssl 

这条记录匹配通过在 TCP/IP 上进行的 SSL 联接企图, host 记录可以匹配 SSL 和非 SSL 的联接企图, 但 hostssl 记录需要 SSL 联接。 

数据库(database) 

  声明记录所匹配的数据库。值 all 表明该记录匹配所有数据库, 值 sameuser表示如果被请求的数据库和请求的用户同名,则匹配。 samegroup 表示请求的用户必须是一个与数据库同名的组中的成员。 在其他情况里,这就是一个特定的 PostgreSQL 的名字。 我们可以通过用逗号分隔的方法声明多个数据库。 一个包含数据库名的文件可以 通过对该文件前缀 @ 来声明.该文件必需和 pg_hba.conf 在同一个目录。 

用户名(user) 

  为这条记录声明所匹配的 PostgreSQL 用户,值 all 表明它匹配 于所有用户。否则,它就是特定 PostgreSQL 用户的名字,多个用户名可以通过用逗号分隔的方法声明,组名字 可以通过用 + 做组名字前缀来声明。一个包含用户名的文件可以 通过在文件名前面前缀 @ 来声明,该文件必需和 pg_hba.conf 在同一个目录。 

ip地址(ip-address)、子网掩码(ip-mask) 

这两个字段包含标准的点分十进制表示的 IP地址/掩码值。 (IP地址只能用数字的方式声明,而不能用域名或者主机名)它们俩放在一起,声明了这条记录匹配的客户机的 IP 地址。 准确的逻辑是:(actual-IP-address xor IP-address-field) and IP-mask-field 对于要匹配的记录必需为零。如果连接方式是host或者hostssl的话,这两项必须指定,否则可以不填。 

认证方法(authentication method) 

trust 

无条件地允许联接,这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。 

reject 

联接无条件拒绝,常用于从一个组中"过滤"某些主机。 

md5 

要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。 

crypt 

类似 md5 方法,只是用的是老式的 crypt 加密认证, 用于 7.2 以前的客户端,对于 7.2 以及以后的客户端,我们建议使用 md5。 

password 

和"md5"一样,但是口令是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这个方式。 

krb4 

用 Kerberos V4 认证用户,只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos,"克尔波洛斯",故希腊神话冥王哈得斯的多头看门狗。Kerberos 是 MIT 开发出来的基与对称加密算法的认证协议和/或密钥 交换方法,其特点是需要两个不同用途的服务器,一个用于认证身份, 一个用于通道两端用户的密钥交换。同时 Kerberos 对网络时间同步 要求比较高,以防止回放攻击,因此通常伴随 NTP 服务。) 

krb5 

用 Kerberos V5 认证用户.只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos V5 是上面 V4 的改良,主要是不再依赖 DES 算法, 同时增加了一些新特性。) 

ident 

获取客户的操作系统名(对于 TCP/IP 联接,用户的身份是通过与运行在客户端上的 ident 服务器联接进行判断的,对于本地联接,它是从操作系统获取的。) 然后检查一下,看看用户是否允许以要求的数据库用户进行联接, 方法是参照在 ident 关键字后面声明的映射。 

如果你使用了 sameuser 映射,那么假设用户名 是相等的。如果没有声明这个关键字,则在 $PGDATA/pg_ident.conf 文件中找出映射名。如果这个文件里包含一条记录标识着ident提供的用户名 和请求的 PostgreSQL 用户名的映射, 那么联接被接受。 

对于本地联接,只有在系统支持Unix域套接字信任证的情况下 才能使用(目前是 Linux, FreeBSD, NetBSD, 和 BSD/OS)。 

pam 

使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules)(PAM)来认证。 

认证配置(authentication-option) 

host    
all         all         192.168.1.0/24        md5
这行的意思是允许所有 192.168.1.*** 
postgresql.conf,

因为pg默认是只监听本地的请求,所以要将listen_address='*','*'是监听所有的,‘localhost’是监听本地


python连接pgsql数据库,print中文乱码

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygtk
pygtk.require('2.0')
import gtk
import psycopg2
myi=[]
conn= psycopg2.connect("user=stdmsg dbname=std_msg password=myhasplcsdn") 
cur = conn.cursor() 
cur.execute('SELECT * FROM students') 
rows = cur.fetchall()
for i in rows:
    myi=i;
cur.close() 
conn.commit() 
conn.close() 
class DeepFuture:         
    def blogurlshow(self):
        #处理unicode字符,解决在WIN下的print乱码
        for ii in myi:
            if isinstance(ii,str):
                print unicode(ii,'utf-8')
            else:
                print ii
    def mynameshow(self):
        print "http://blog.csdn.net/u010255642"
    def buttonpress(self,widget, data):
        if data=="blog":
            self.blogurlshow()
        else:
            self.mynameshow()                    
    def delwin_event(self,widget,event,data=None):
        #如果你在"delete_event"信号处理中,返回FALSE,GTK会继续发射这个信号,以供destroy,否则返回TRUE,表示这个信号已经被处理,不需要再处理了,也不需要再发射这个信号了,这意味着你不能destroy窗口。
        print("delete event!")
        return False
    def destroy_win(self,widget,data=None):
        #窗口销毁处理
        print("destroy event!")        
        gtk.main_quit()
    def __init__(self):
        #创建一个新窗口
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title("2个按钮的窗口")
        #放入一个不可见的box,然后在里面放2个按钮,并设置回调
        self.buttonbox = gtk.HBox(False, 0)
        self.window.add(self.buttonbox) 
        self.blogbutton = gtk.Button("记录")
        self.namebutton = gtk.Button("博客")        
        self.blogbutton.connect("clicked", self.buttonpress, "blog")
        self.namebutton.connect("clicked", self.buttonpress, "name") 
        #加入box
        self.buttonbox.pack_start(self.blogbutton, True, True, 0)   
        self.buttonbox.pack_start(self.namebutton, True, True, 0)  
        #显示
        self.blogbutton.show()
        self.namebutton.show()
        self.buttonbox.show()  
        #指定窗口信号与相关处理事件
        self.window.connect("delete_event", self.delwin_event)			
        self.window.connect("destroy", self.destroy_win)
        self.window.set_border_width(15)
        #显示窗口
        self.window.show()
    def main(self):
        gtk.main()
if __name__ == "__main__":	
	deep=DeepFuture()
	deep.main()


下面是这个示例程序的输出

1
张三
22
1
1
1
http://blog.csdn.net/u010255642
delete event!


你可能感兴趣的:(python,pygtk)