python笔记

最新出于兴趣,做了几个爬虫小项目,很早以前学过一点点python,大概是hello world的程度吧~ 现在说从零开始也不为过,在折腾过程中,遇到了很多问题不过最终都解决了,我会陆续更新几篇期间记录的笔记,内容都比较杂乱无序。这篇是python笔记。

一、各种中文乱码问题

1. Python的中文问题解决办法

如果运行遇到这种报错SyntaxError: Non-ASCII character....but no encoding declared 原因是它不能识别中文编码。要在第一行加入 # -*- coding: GBK -*-

2. python使用浏览器打开中文 url显示 乱码

python的webbrowser.open()使用的编码是gb2312

url = 'www.中文url.com'  
webbrowser.open(url.encode('gb2312'))  

3. python 输出中文列表

如果不通过以下.join的方法,直接用print,会出现乱码

TestList = ["asdf", "中文",'asdasdasd','哈哈哈哈']  
print ", ".join(TestList)  
输出结果: asdf, 中文, asdasdasd, 哈哈哈哈

4. 解决写入文件时遇到字符编码问题

错误:UnicodeEncodeError: 'ascii' codec can't encode characters in position
原因是python2.7在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错,不过在python3就不会有这样的问题。

临时解决方法: 代码中加入如下三行

import sys  
reload(sys)  
sys.setdefaultencoding('utf8')  

如果不想在每个文件中都加这三行,就在python的Lib\site-packages文件夹下新建一个sitecustomize.py
内容如下:

# encoding=utf8 
import sys 

reload(sys)  
sys.setdefaultencoding('utf8')  

这样的话,系统在python启动的时候,自行调用该文件,设置系统的默认编码


二、各种输出问题

1. print 格式化输出

%x --- hex 十六进制
%d --- dec 十进制
%d --- oct 八进制

print "%" % ("aabbccdd")    -----%s字符串  
%.5s --字符串精确到5个字符
print "%.*s" % (6,"中文字符")  --字符串精确到6个字符 注: 一个中文字占3个字符  
print "%12.6s" % ("中文字符") --字符精确到6个字符,总宽度12个字符(前面空)

%r是一个万能的格式符
formatter = "%r %r %r %r"  
print formatter % (1, 2, 3, 4)  
输出结果: 1 2 3 4

2. print 不换行打印

improt sys

print '\r'+string,   #前面加\r 句末加,  
sys.stdout.flush()  

三、各种日期相关操作

1. 获取日期

>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2015, 1, 12, 23, 9, 12, 946118)  
>>> type(now)
<type 'datetime.datetime'>  

2. 输出日期:

>>>print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2015-11-23 12:01:39  

3. 循环日期

import datetime  
def main():  
    begin = datetime.date(2012,6,1)  
    end = datetime.date(2012,6,7)  
    for i in range((end - begin).days+1):  
        day = begin + datetime.timedelta(days=i)  
        print str(day)

4. 日期相关的各种操作总结

  1. 用python 把datetime转成字符串
  2. 用python 把字符串转成datetime
  3. 用python 把字符串转成时间戳形式
  4. 用python 把时间戳转成字符串形式
  5. 用python 把把datetime类型转外时间戳形式
  6. 用python 计算两个日期之间的差
  7. 用python 计算两个日期的 timestamp 差值
  8. 用python 比较两个日期的大小
  9. 指定日期加上 一个时间段,天,小时,或分钟之后的日期

代码如下:

#coding:utf-8
import datetime  
import time  
# 把datetime转成字符串
def datetime_toString(dt):  
    return dt.strftime("%Y-%m-%d")

# 把字符串转成datetime
def string_toDatetime(string):  
    return datetime.datetime.strptime(string, "%Y-%m-%d")

# 把字符串转成时间戳形式
def string_toTimestamp(strTime):  
    return time.mktime(string_toDatetime(strTime).timetuple())
# 把时间戳转成字符串形式
def timestamp_toString(stamp):  
    return time.strftime("%Y-%m-%d-%H", time.localtime(stamp))
# 把datetime类型转外时间戳形式
def datetime_toTimestamp(dateTime):  
    return time.mktime(dateTime.timetuple())
# 返回两个日期之间的差
def substract_DateTime(dateStr1,dateStr2):  
    d1=string_toDatetime(dateStr1)
    d2=string_toDatetime(dateStr2)
    return d2-d1
# 两个日期的 timestamp 差值
def substract_TimeStamp(dateStr1,dateStr2):  
    ts1= string_toTimestamp(dateStr1)
    ts2= string_toTimestamp(dateStr2)
    return ts1-ts2
# 两个日期的比较 也可以用timestamep方法比较
def compare_dateTime(dateStr1,dateStr2):  
    date1 = string_toDatetime(dateStr1)
    date2 = string_toDatetime(dateStr2)
    return date1.date()>date2.date()
# 指定日期加上 一个时间段,天,小时,或分钟之后的日期
def dateTime_Add(dateStr,days=0,hours=0,minutes=0):  
    date1= string_toDatetime(dateStr)
    return   date1+datetime.timedelta(days=days,hours=hours,minutes=minutes)

if __name__=='__main__':  
    print substract_DateTime('2012-12-12','2012-01-01')
    #-346 days, 0:00:00
    print substract_DateTime('2012-12-12','2012-01-01').days
    #-346
    print substract_TimeStamp('2012-12-12','2012-01-01')
    #29894400.0   
    print substract_TimeStamp('2012-12-12','2012-01-01')/(24*60*60),'天'
    #346.0 天
    print compare_dateTime('2012-12-12','2012-01-01')
    #True
    print dateTime_Add('2012-12-12',days=10,hours=5,minutes=10)
    #2012-12-22 05:10:00

5. 根据当前日期,对年月进行加减的方法

import calendar, datetime

def increment_month(when):  
    days = calendar.monthrange(when.year, when.month)[1]
    return when + datetime.timedelta(days=days)

now = datetime.datetime.now()  
print 'It is now %s' % now  
print 'In a month, it will be %s' % increment_month(now)  

6. 获取昨天和明天的日期

import datetime  
today = datetime.date.today( )  
yesterday = today - datetime.timedelta(days=1)  
tomorrow = today + datetime.timedelta(days=1)  
print yesterday, today, tomorrow  
#输出:2015-12-17 2015-12-18 2015-12-19 

四、各种字符串操作

1. 截取字符串

str = ’0123456789′  
print str[0:3] #截取第一位到第三位的字符  
print str[:] #截取字符串的全部字符  
print str[6:] #截取第七个字符到结尾  
print str[:-3] #截取从头开始到倒数第三个字符之前  
print str[2] #截取第三个字符  
print str[-1] #截取倒数第一个字符  
print str[::-1] #创造一个与原字符串顺序相反的字符串  
print str[-3:-1] #截取倒数第三位与倒数第一位之前的字符  
print str[-3:] #截取倒数第三位到结尾  
print str[:-5:-3] #逆序截取  

2. 字符串里只显示字母与数字

要只显示数字可以修改fomart = '0123456789'

def OnlyCharNum(s,oth=''):  
    s2 = s.lower();
    fomart = 'abcdefghijklmnopqrstuvwxyz0123456789' 
    for c in s2:
        if not c in fomart:
            s = s.replace(c,'');
    return s;

3. 输入字符

str = raw_input("Enter your input: ")  
print "Received input is : ", str  

五、各种列表相关操作

1. 列转换为字符串

list = ["恐龙园","嬉戏谷","苏州乐园"]  
strlist ="".join(a)  
输出:   恐龙园 嬉戏谷 苏州乐园
#输出成SQL语句格式:
strlist ="','".join(a)  
输出:  '恐龙园','嬉戏谷','苏州乐园'

2. 合并列表成为一个列表

A = [1, 2, 3]  
B = [4, 5, 6]  
A.extend(B) 或者 A += B  
输出: [1, 2, 3, 4, 5, 6]

3. 函数返回一个列表

def MyList():  
    MyListALL = []
    ids = range(10,20)
    for id in ids:
        #StringA = str(id)   #把字符变成字符串
        MyListALL.append(id) #遍历ids,追加到列表中
    return MyListALL

六、各种文件操作

1. 获取文件路径

sys.path

2. 写入文件

文件I/O教程

# -*- coding:utf-8 -*-
# 参数a 表示打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾
# 该模式下新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
fileAA = open('name','a')

RR = range (1,10)  ##生成一个列表  
for r in RR:  ##遍历列表  
    AA = str(r)+" hello"+'\n'  ##定义一个新的字符串
    fileAA.write(AA)  ##将新字符串写入文件

fileAA.close() # 关闭文件  

七、各种数据库相关操作

1. python访问mysql

在python中利用fetchone() 方法获取的数据是一个元组(tuple) 元组是不可变的序列,元组也支持索引和分片操作

# -*- coding: UTF-8 -*-
import MySQLdb

# 连接mysql的方法:connect('ip','user','password','dbname',参数) 设置参数charset="utf8"
db = MySQLdb.connect("localhost","python","WNhc4gwY","allprice",charset="utf8" )  
# 使用cursor()方法获取操作游标
cursor = db.cursor()  
# 使用execute方法执行SQL语句
cursor.execute("SELECT * FROM price")  
# 使用 fetchone() 方法获取一条数据库。 返回的是一个 元组
data = cursor.fetchone()

for item in data:  #遍历该元组  
    print item

for index in range(len(data)):   #data里一共有n个项,遍历这n个项输出  
    print data[index]

#不要忘记关闭数据库
db.close()  

2. pandas 用列数据设为索引index

df.set_index(['column'],inplace=1)

3. 合并pandas的数据框架

两个df相merge

  1. 两个df的column都一样, index不重复(增加行):
    pd.concat([df1,df2])

  2. 两个df的index一样, column不同(增加列)
    pd.concat([df1,df2], axis = 1)


各种其他

1. 关于json操作

b = json.load(open('D://Server Data//eagle805//emmetrics//forms//leads\July_2014.cd.lead.agg'))

为尽可能避免 ValueError: Unterminated string starting at 错误,将以上形式改写为:

a = open('D://Server Data//eagle805//emmetrics//forms//leads\July_2014.cd.lead.agg')  
b = json.load(a)  

leeway

继续阅读此作者的更多文章

comments powered by Disqus