Python学习笔记

文件操作 / IO

os.walk() 和 os.path.walk()

一、os.walk()

函数声明:os.walk(top,topdown=True,onerror=None)

(1)参数top表示需要遍历的顶级目录的路径。

(2)参数topdown的默认值是“True”表示首先返回顶级目录下的文件,然后再遍历子目录中的文件。当topdown的值为"False"时,表示先遍历子目录中的文件,然后再返回顶级目录下的文件。

(3)参数onerror默认值为"None",表示忽略文件遍历时的错误。如果不为空,则提供一个自定义函数提示错误信息后继续遍历或抛出异常中止遍历。

返回值:函数返回一个元组,含有三个元素。这三个元素分别是:每次遍历的路径名、路径下子目录列表、目录下文件列表。

 

二、os.path.walk

函数声明:os.path.walk(top,func,arg)

(1)参数top表示需要遍历的目录路径

(2)参数func表示回调函数,即对遍历路径进行处理的函数。所谓回调函数,是作为某个函数的参数使用,当某个时间触发时,程序将调用定义好的回 调函数处理某个任务。注意:walk的回调函数必须提供三个参数:第1个参数为os.path.walk的参数arg,第2个参数表示目录 dirname,第3个参数表示文件列表names。注意:os.path.walk的回调函数中的文件列表不和os.walk()那样将子目录和文件分 开,而是混为了一摊,需要在回调函数中判断是文件还是子目录。

(3)参数arg是传递给回调函数的元组,为回调函数提供处理参数,arg可以为空。回调函数的第1个参数就是用来接收这个传入的元组的。

参考: http://my.oschina.net/duhaizhang/blog/68202

 

 

 

 

输入

input 和 raw_input

input返回的是数值类型: int 或 float

raw_input返回的是string类型

例子

>>> s = input('请输入:')
请输入:45 + 32
>>> s
77

>>> type(s)

<type 'int'>
>>> s = raw_input('请输入:')
请输入:45 + 32
>>> s
'45 + 32'
>>> type(s)
<type 'str'>

 

 

 

Python三目运算符的实现

条件 and 表达式1 or 表达式2

例子:

>>> 1 > 0 and 'yes' or 'no'
'yes'


其他语言的写法对比:
1 > 0 ? 'yes' : 'no'

 

 

 

** 运算符 -- 相当于 power()函数

>>> 2 ** 1        # 2的一次方
2
>>> 2 ** 2        # 2的二次方
4
>>> 2 ** 3        # 2的三次方
8

妙用 ** 运算符 开根号
# 开根号2
>>> 2 ** (1.0/2)
1.4142135623730951
>>> 4 ** (1.0/2)
2.0

# 开根号3
>>> 8 ** (1.0/3)
2.0

注: 1/3, 只保留整数位, 也就是 1/3的结果是0

 

 

Python中的  <>  相当于 !=, 不等于   -- 不建议使用

>>> 2 <> 1              # 2 不等于 1
True

 

 

字符串

字符计数问题
'here is a sample of english text'
问里面各个字符出现次数是多少

要求返回结果: (字典是无序的, 所以只要结果正确, 不要求顺序如此)
{'a': 2, ' ': 6, 'e': 5, 'g': 1, 'f': 1, 'i': 2, 'h': 2, 'm': 1, 'l': 2, 'o': 1, 'n': 1, 'p': 1, 's': 3, 'r': 1, 't': 2, 'x': 1}
 
解法:
s = 'here is a sample of english text'
{i: s.count(i) for i in set(s)}

 

 

 

Python中, 单引号 双引号 和 三单引号 三双引号的区别

单引号 和 双引号是一样的, 括起来表示字符串

三单引号 和 三双引号也是一样的, 括起来会帮助我们自动换行, 对于有多个 '\n'的字符串, 会清晰易懂

>>> s = '''hello,
... my
... name
... is
... Juggling.'''
>>> s
'hello,\nmy\nname\nis\nJuggling.'
>>> print s
hello,
my
name
is
Juggling.

 

 

利用urllib2抓取网页内容

>>> import urllib2
>>> f = urllib2.open('http://fanyi.youdao.com/openapi.do?keyfrom=zqhong&key=694644553&type=data&doctype=json&version=1.1&q=good')
>>> f = urllib2.urlopen('http://fanyi.youdao.com/openapi.do?keyfrom=zqhong&key=694644553&type=data&doctype=json&version=1.1&q=good')
>>> json_str = f.read()

 

 

利用Pygame播放mp3

>>> import pygame.mixer as mixer
>>> mixer.init()
>>> mixer.music.load('na.mp3')
>>> mixer.music.play()



--------------------------------------------------------
方法介绍:
pygame.init() 进行全部模块的初始化,
pygame.mixer.init() 或者只初始化音频部分
pygame.mixer.music.load('xx.mp3') 使用文件名作为参数载入音乐 ,音乐可以是ogg、mp3等格式。载入的音乐不会全部放到内容中,而是以流的形式播放的,即在播放的时候才会一点点从文件中读取。
pygame.mixer.music.play()播放载入的音乐。该函数立即返回,音乐播放在后台进行。
play方法还可以使用两个参数
pygame.mixer.music.play(loops=0, start=0.0) loops和start分别代表重复的次数和开始播放的位置。
pygame.mixer.music.stop() 停止播放,
pygame.mixer.music.pause() 暂停播放。
pygame.mixer.music.unpause() 取消暂停。
pygame.mixer.music.fadeout(time) 用来进行淡出,在time毫秒的时间内音量由初始值渐变为0,最后停止播放。
pygame.mixer.music.set_volume(value) 来设置播放的音量,音量value的范围为0.0到1.0。
pygame.mixer.music.get_busy() 判断是否在播放音乐,返回1为正在播放。
pygame.mixer.music.set_endevent(pygame.USEREVENT + 1) 在音乐播放完成时,用事件的方式通知用户程序,设置当音乐播放完成时发送pygame.USEREVENT+1事件给用户程序。 pygame.mixer.music.queue(filename) 使用指定下一个要播放的音乐文件,当前的音乐播放完成后自动开始播放指定的下一个。一次只能指定一个等待播放的音乐文件。

--------------------------------------------------------

 

 

 

关于id()方法

>>> i1 = 10
>>> i2 = 10
>>> id(i1)
28790912
>>> id(i2)
28790912
>>> f1 = 1.5
>>> f2 = 1.5
>>> id(f1)
28862112
>>> id(f2)
28862160


id()方法可以得到对象在内存中的位置, 类似于"指针"
Python默认会缓冲Integer, 但是Float不会. 从上面可以看出

 

 

关于.py, .pyc, .pyo文件

py是源程序
pyc是编译后的程序 在执行python源程序时,python会自动将源程序编译成为pyc文件
pyo是优化编译后的程序 python -O 源文件即可将源程序编译为pyo文件 

如何将py编译成pyc?
1. 只编译一个py文件
import py_compile
py_compile.compile(r'H:\game\test.py')

2. 对一个文件夹的所有py文件进行编译
import compileall
compileall.compile_dir(dirpath)


如何将py编译优化成pyo?
python -O -m py_compile file.py

 

 

 

关于3 < 4 < 5

3 < 4 < 5  ==> 相当于 3 < 4 and 4 < 5

>>> 3 < 4 < 5
True
>>> 3 < 4 and 4 < 5
True

 

 

XML to JSON

import xmltodict, json

o = xmltodict.parse('<a>text</a>')
json.dumps(o)

 

 

pip  -- A tool for installing and managing Python packages.

pip 是管理Python包的工具. 类似于 easy_install

1. 安装pip
$ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
$ python get-pip.py

2. pip的使用
# 安装第三方包
$ pip install simplejson

# 升级第三方包
$ pip install --upgrade simplejson

# 卸载第三方包
$ pip uninstall simplejson

 

 

Python按行读取文件,如何去掉'\n'

for line in file.readlines():
    line=line.strip('\n')

 

 range()的用法  和 切片的用法差不多

# 从0开始, 不包括10
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 从5开始, 不包括10
>>> range(5, 10)
[5, 6, 7, 8, 9]

# 从0开始, 不包括10, 步长为3
>>> range(0, 10, 3)
[0, 3, 6, 9]

# 从-10开始, 不包括-100, 步长为-30 
>>> range(-10, -100, -30)
[-10, -40, -70]

>>> range(10, 0, -1)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

 

 

Linux中使用Python模拟键盘按键

这里以 ctrl + shifit + v为例子 (我的系统中, ctrl + shift + v为粘贴)

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

import virtkey

v = virtkey.virtkey()

# press按下
v.press_keycode(37)             # ctrl
v.press_keycode(50)             # shift
v.press_unicode(ord('v'))       # v

# 释放按键
v.release_unicode(ord('v'))
v.release_keycode(50)
v.release_keycode(37)

这样就有一个问题, 如何获取 keycode?

方法1:
$ showkey -k
注: 这个方法获取的keycode需要 加8

方法2:
$ xve

方法3:
dmesg
注: 如果是特殊的keycode, 可以通过这个方法

方法4:
xmodmap -pke

 

 

 

执行系统命令和sleep

import os
os.system('commond')
example:
os.system('ls')     #执行ls命令


import time
time.sleep(1)        # 暂停1秒

 

 

Python中各进制的转换

首先, Python中二进制, 八进制, 十六进制的表示

# 二进制
>>> 0b10
2

# 八进制
>>> 010
8

# 十六进制
>>> 0x10
16

 

各进制的转换

    #十进制转换二进制 
    >>> bin(10) 
    '0b1010' 
     
    #十进制转换十六进制 
    >>> hex(10) 
    '0xa' 
     
    #二进制转换十进制 
    >>> int('1010',2) 
    10 
     
    #十六进制转换十进制 
    >>> int('0xa',16) 
    10 
     
    #十六进制转换二进制 
    >>> bin(0xa) 
    '0b1010' 
     
    #二进制转换十六进制 
    >>> hex(0b1010) 
    '0xa' 

 

Python中, 对时间的处理

http://blog.csdn.net/xiaobing_blog/article/details/12591917

# 1. 时间戳转字符串 --> 获取当前的时间戳, 并格式化成特定的字符串
>>> import time
>>> now = int(time.time())
>>> timeArray = time.localtime(now)
>>> timeArray
time.struct_time(tm_year=2014, tm_mon=8, tm_mday=25, tm_hour=16, tm_min=28, tm_sec=30, tm_wday=0, tm_yday=237, tm_isdst=0)
>>> time.strftime('%Y-%m-%d %H:%M:%S', timeArray)
'2014-08-25 16:28:30'


# 2. 将字符串转时间戳
>>> a = '2013-10-10 23:40:00'
>>> timeArray = time.strptime(a, '%Y-%m-%d %H:%M:%S')
>>> timeStamp = int(time.mktime(timeArray))
>>> timeStamp
1381419600

 

某年某月某日是星期几

>>> import datetime
>>> todate = datetime.datetime(2014, 9, 1)
>>> todate
datetime.datetime(2014, 9, 1, 0, 0)
>>> todate.weekday() + 1
1


为什么需要加1, 查看文档
weekday(...)
    Return the day of the week represented by the date.
    Monday == 0 ... Sunday == 6

 

 

 

命令行解析工具 getopt()的使用

预备知识:

文件: get.py
内容:

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

for arg in sys.args:
    print arg



调用get.py
python get.py -o 123.txt --help file1 file2     
结果:
get.py
-o
123.txt
--help
file1
file2

注: argv[0] --> 我们python脚本的名字 后面才是我们带的参数

实例分析:

import sys, getopt

try:
    opts, args = getopt.getopt(sys.argv[1:], 'ho:', ['help', 'output='])
except getopt.GetoptError as err:
    print str(err)
    sys.exit(2)

for o, a in opts:
    if o in ('-h', '--help'):
        print o, a
        sys.exit()
    if o in ('-o', '--output'):
        print o, a


解释:
    1. sys.argv[1:], 过滤掉第一个参数(因为它是执行脚本的名字, 不应算参数的一部分)
    2. 短格式分析串'ho:', 其中, 'h'是开关选项, 不带参数, 'o:'则表示改选项后面带一个参数, 举例:  python example.py -h -o 123.txt
    3. 长格式分析串列表: ['help', 'output=']. 同理, 'help'是开关选项, 不带参数, 'output='后面带参数. (后面有‘=’表示要带参数)

    分析: '-h -o file --help --output=out.txt file1 file2'
    分析后, 
        opts为:
        [('-h', ''), ('-o', 'file'), ('--help', ''), ('--output', 'out.txt')]
        args则为:
        ['file1', 'file2']

 

 

httplib2的使用

# 1. 获取httpli2.Http对象
import httplib2

h = httplib2.Http()

Http这个class的 初始化方法 __init__:
__init__(self, cache=None, timeout=None, proxy_info=<function proxy_info_from_environment>, ca_certs=None, disable_ssl_certificate_validation=False)

注:
h = httplib2.Http('.cache')
这个意思是: 讲缓冲保存在当前目录下的 '.cache'目录

# 2. 例子 -- To PUT some content to a server that uses SSL and Basic authentication  注: method都需要大写, 比如"GET", "PUT"
#!/usr/bin/env python
#-*- coding: utf-8 -*-

import httplib2

h = httplib2.Http('.cache')
h.add_credentials('name', 'password')
(resp, content) = h.request('https://example.org/chapter/2', 'PUT', body='This is text', headers={'content-type': 'text/html'})

# 例子
import httplib2

h = httplib2.Http('.cache')
(resp, content) = h.request('http://bitworking.org/', 'GET')
(resp, content) = h.request('http://bitworking.org/', headers={'cache-control': 'no-cache'})


附录:
 |  request(self, uri, method='GET', body=None, headers=None, redirections=5, connection_type=None)
 |      Performs a single HTTP request.
 |      
 |      The 'uri' is the URI of the HTTP resource and can begin with either
 |      'http' or 'https'. The value of 'uri' must be an absolute URI.
 |      
 |      The 'method' is the HTTP method to perform, such as GET, POST, DELETE,
 |      etc. There is no restriction on the methods allowed.
 |      
 |      The 'body' is the entity body to be sent with the request. It is a
 |      string object.

 注: httplib2返回的 resp 和 content 分别是 response 和 content, 其中, response是字典, 可以很方便的得到结果, 比如 resp['status'] , 得到状态码

 

 

 

 

Python自动补齐

https://github.com/itnihao/vimrc-python

 

注: 快捷键修改成 ctrl + n

编辑 /home/akira/.vim/bundle/pydiction/after/ftplugin/python_pydiction.vim

找到 inoremap <silent> <buffer> <Tab>

修改成: inoremap <silent> <buffer> <C-n>

 

 

python判断文件和文件夹是否存在

import os
os.path.isfile('test.txt') #如果不存在就返回False
os.path.exists(directory) #如果目录不存在就返回False

 

 

Python中执行系统命令的三种方法

# 第一种 system(command) -> exit_status   返回的是exit_status
>>> import os
>>> status = os.system('ls')
>>> status
0

# 第二种 os.popen(command [, mode='r' [, bufsize]]) -> pipe    Open a pipe to/from a command returning a file object.
>>> import os
>>> result = os.popen('df -h')
>>> result.read()
'Filesystem            Size  Used Avail Use% Mounted on\n/dev/sda1             

# 第三种  commands - Execute shell commands via os.popen() and return status, output.
getoutput(cmd)
    Return output (stdout or stderr) of executing cmd in a shell.
    
getstatus(file)
    Return output of "ls -ld <file>" in a string.
    
getstatusoutput(cmd)
    Return (status, output) of executing cmd in a shell.

>>> import commands
>>> commands.getstatusoutput('ls /home/akira/Documents')
(0, 'mykeycode\nsearch_keyword.py\ntest.py')
>>> commands.getoutput('ls /home/akira/Documents')
'mykeycode\nsearch_keyword.py\ntest.py'
>>> commands.getstatus('/home/akira/Documents/mykeycode')
'-rw-r--r-- 1 akira akira 12945 Aug 24 13:32 /home/akira/Documents/mykeycode'

 

 

Python中的 chr(), ord(), unichr()

# int转char    例子: chr(65)  --> 'A'
chr(...) chr(i)
-> character Return a string of one character with ordinal i; 0 <= i < 256.
# char转int 例子: ord('A') --> 65 ord(...) ord(c)
-> integer Return the integer ordinal of a one-character string. # int转unicode 例子: unichr(65) --> u'A' unichr(...) unichr(i) -> Unicode character Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.

 

Python中如何查看内置函数

import __builtin__
help(__builtin__)

 

 

Python中如何不换行输出  --> 看内置函数print()的参数

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.


注: 需要python3.x支持
# file   默认print输出到标准输出流屏幕, 不过这个是可以更改的 注:需要close()这个 file-like object 不然 默认系统会先写入缓冲  到缓冲一定大小才会输出
>>> fw = open('./hhh', 'w')
>>> print('hello world!', file=fw)
>>> fw.close()

# sep   两个value中间用什么分隔。 默认是 space
>>> print('hello','world', sep='1')
hello1world

# end   默认, 输出的时候以'\n'结尾, 但是有的时候, 我们不需要, 则可以用 end=''替换
>>> print('hello', end='')
hello>>> 

# flush, 当flush为True时, 强制每次写入数据时都刷新一次
# 注: 我们不需要close fw就可以看到我们写入的数据了
>>> fw = open('ggg', 'w')
>>> print('jjj', file=fw, flush=True)

 

 

Python如何查询函数, 和其他帮助信息

# 1. 打印关键字
>>> help()
help> keywords
Here is a list of the Python keywords.  Enter any keyword to get more help.

and                 elif                if                  print
....
del                 global              pass                

# 2. 查看相关话题  这里以NONE为例子
help> topics
help> NONE


# 3. 查询所有可用模块
help> modules

Please wait a moment while I gather a list of all available modules...
ANSI                _random             gdbm                quopri
BaseHTTPServer      _sha                genericpath         random
Bastion             _sha256             getopt              re
....
_multiprocessing    functools           pylint              zope
_osx_support        future_builtins     pynotify            
_pyio               gc                  pyquery         

# 4. 使用dir, 查看对象有什么属性
>>> dir('a')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

# 5. 查看当前作用域的名称
>>> dir()
['GFileDescriptorBased', 'GInitiallyUnowned', 'GPollableInputStream', 'GPollableOutputStream', 'GstChildProxy', 'GstProxyPad', 'Person', '__builtins__', '__doc__', '__name__', '__package__', 'a', 'bob', 'f', 'info', 'joe', 'keyword', 'p', 'str', 'sys']

 

 

 

sys模块的常用方法

# 1. sys.argv   传入参数  argv[0]为Python脚本名

# 2. sys.path   模块搜索路径 path[0]为当前脚本目录  修改的话  可以在 ~/.zshrc 或者 ~/.profile 中添加 export PYTHONPATH=/home/akira/Documents/Python/

# 3. 查看平台
>>> sys.platform
'linux2'

# 4. 查看Python版本
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)

# 5. 查看最大整数
>>> sys.maxint
9223372036854775807

 

 

re模块

关于flags参数

解释

    Some of the functions in this module takes flags as optional parameters:
        I  IGNORECASE  Perform case-insensitive matching.
        L  LOCALE      Make \w, \W, \b, \B, dependent on the current locale.
        M  MULTILINE   "^" matches the beginning of lines (after a newline)
                       as well as the string.
                       "$" matches the end of lines (before a newline) as well
                       as the end of the string.
        S  DOTALL      "." matches any character at all, including the newline.
        X  VERBOSE     Ignore whitespace and comments for nicer looking RE's.
        U  UNICODE     Make \w, \W, \b, \B, dependent on the Unicode locale.
    
    This module also defines an exception 'error'.


使用:
>>> import re
>>> re.IGNORECASE    (常数)

 

例子:

# re.IGNORECASE 忽略大小写
>>> re.findall('[a-z]', 'abcABCtT', flags=re.IGNORECASE)
['a', 'b', 'c', 'A', 'B', 'C', 't', 'T']

 

 

在Python中使用ping

https://pypi.python.org/pypi/ping/0.2

pip install ping
方法介绍:
FUNCTIONS checksum(source_string) I
'm not too confident that this is right but testing seems to suggest that it gives the same answers as in_cksum in ping.c do_one(dest_addr, timeout, psize) Returns either the delay (in seconds) or none on timeout. quiet_ping(dest_addr, timeout=2, count=4, psize=64) Send `count' ping with `psize' size to `dest_addr' with the given `timeout' and display the result. Returns `percent' lost packages, `max' round trip time and `avrg' round trip time. receive_one_ping(my_socket, id, timeout) Receive the ping from the socket. send_one_ping(my_socket, dest_addr, id, psize) Send one ping to the given >dest_addr<. verbose_ping(dest_addr, timeout=2, count=4, psize=64) Send `count' ping with `psize' size to `dest_addr' with the given `timeout' and display the result.

常用方法:
quiet_ping(dest_addr, timeout=2, count=4, psize=64)
返回值:
>>> ping.quiet_ping('127.0.0.1')
(0, 0.15997886657714844, 0.1087188720703125)
第一个数字'0': 丢失的包的个数; 第二个数字'0.15997886657714844': 最大使用使用; 第三个数字'0.1087188720703125': 平均使用时间

# ping一个不存在的地址 结果 max_time = None, avg_time = None
>>> ping.quiet_ping('1.1.1.1')
(100, None, None)



verbose_ping(dest_addr, timeout-3, count-4, psize=64)

>>> ping.verbose_ping('127.0.0.1')
ping 127.0.0.1 with ... get ping in 0.1800ms
ping 127.0.0.1 with ... get ping in 0.0880ms
ping 127.0.0.1 with ... get ping in 0.0839ms
ping 127.0.0.1 with ... get ping in 0.0830ms

 注: 使用这个ping模块, 需要root的权限执行。
 不然, 会抛出如下错误

 socket.error: Operation not permitted - Note that ICMP messages can only be sent from processes running as root.
 实例代码, 测试一个网段存活的ip

 https://gist.github.com/zqhong/85828f78b11995bde1d7 

 

 

pdb调试技巧

q  退出debug
h  打印可用的调试命令
b  设置断点,b 5 在第五行设置断点
h command  打印command的命令含义
disable codenum  使某一行断点失效
enable codenum   使某一行的断点有效
condition codenum xxx  针对断点设置条件
c    继续执行程序,直到下一个断点
n    执行下一行代码,如果当前语句有函数调用,则不会进入函数体中
s    执行下一行代码,但是s会进入函数
w    打印当前执行点的位置
j    codenum  让程序跳转到指定的行
l    列出附近的源码
p    打印一个参数的值
a    打印当前函数及参数的值
回车  重复执行上一行

 

 

 

注: 这里使用的是 Python 2.7

 

你可能感兴趣的:(python)