Shanghai, China

E-mail: henter@henter.me
Wechat: henter

Python备忘录

记录python使用过程中的各种问题,好记性不如烂博客。

SyntaxError: Non-ASCII character ‘\xe5’ in file

这个错误是python的默认编码文件是用的ASCII码, 将文件存成了UTF-8也没用,解决办法很简单,只要在文件开头加入

# -*- coding: UTF-8 -*-

或者

#coding=utf-8 

就能解决问题了。


字符串处理

常用

str1 + str2 连接
len(str) 长度
str.trip() 去空格
str.lstrip()
str.rtrip()

str.replace(old, new[, maxtimes]) 替换
str[from:to] 截取

'1,2,3,4,5'.split(',') 分割

判断

str.startwith()
str.endwith()
str.upper()
str.lower()
str.capitalize()
str.isalnum() 是否全字母或数字
str.isalpha() 是否全字母
str.isdigit() 是否全数字
str.islower()
str.isupper()

'a' in 'abc'  True

查找

 str.find(needle)
 str.find(needle, start, end)
 str.rfind(needle)
 str.count(needle)
 
 尽量不要用 str.index(needle),找不到时会抛异常,find返回-1

正则

p = re.compile(pattern)
result  = p.match(str)

下面这种用法与上面结果相同

result = re.match(pattern, str)

更多常用方法:
search(pattern, str) 全部匹配 查找位置
match(pattern, str)  开头匹配
split(pattern, str)  分割
findall(pattern, str)  查找全部
sub(pattern, replace, str)  替换

文件、目录操作

文件读写

handle = open('test.txt')
print handle.read(maxbytes)

读行
file(filename)
handle.readline(maxbytes)
handle.readlines(maxlines)

从头开始读
handle.seek(0)

写
handle = open('test.txt', 'w')
handle.write(str)  每次写一行
handle.writelines(str)  多行一次写入

不常用的
handle.flush() 将缓冲区内容写入硬盘
handle.tell() 返回文件操作标记的当前位置
handle.next() 返回下一行

关闭
handle.close()


打开文件方式参数,跟其它语言里面的类似
r 读 默认
w 写
a 追加
rb wb 二进制

其它
import os
os.stat(file) 获取文件属性
os.path.getsize(file) 获取文件大小

目录操作

import os, shutil

os.getcwd() 当前目录
os.listdir(dir) 返回指定目录下所 有文件和目录名
os.remove(file) 删除文件
os.removedirs(dir) 删除目录 递归

os.path.isfile(path)
os.path.isdir(path)
os.path.isabs(path) 是否为绝对路径
os.path.exists(path) 路径是否存在

path,file = os.path.split('home/henter/test.txt') => ('/home/henter', 'test.txt')
f, ext = os.path.splitext() 分离扩展名
os.path.dirname(path)
os.path.basename()
os.path.join(path1, path2)

os.chmod(file)
os.rename(old ,new)
os.mkdirs('/home/henter/newdir/test/') 创建多级目录
os.mkdir('newdir') 创建目录

os.mkdir(dirname)  创建目录	
shutil.copyfile(oldfile, newfile)复制文件 
shutil.copy(olddir, newdir) 复制文件夹
shutil.copytree(olddir, newdir) 复制目录,newdir必须不存在
shutil.move(oldpos, newpos) 重命名文件或目录

os.remove(file) 删除文件
shutil.rmtree(dir) 删除目录
os.chdir(path) 换路径

os.system(command) 运行系统命令

数据编组

可以用cPickle代替pickle

import pickle

保存
handle = open('test.txt', 'w')
data = ['data', 'for', 'write']
pickle.dump(data, handle)
handle.close()

读取
handle = open('test.txt', 'r')
data = pickle.load(handle)
handle.close()



参考:

使用 Python 模块 re 实现解析小工具

Python内置的字符串处理函数整理

完善扇贝Alfred2 workflow,可添加单词到词库

今天完善了一下前面发布的基于Alfred2的扇贝workflow

现主要功能如下:

  • 单词查询,关键词sb :)
  • 按回车添加单词到词库,并显示通知
  • 按住command,回车可以进入单词页面

显示通知用到了AppleScript,话说这脚本功能挺强大的。 这是我第一次写这玩意儿,google了半天才写好下面的通知功能,囧。

AppleScript脚本显示通知

显示通知的效果

AppleScript脚本显示通知

地址:https://github.com/henter/Shanbay-Alfred2

折腾完了

睡觉。

用python写了个扇贝词典的Alfred2插件

前不久才知道有Alfred2这么一个神器,工作效率大大提升。

关于这款软件就不多介绍了。

今天写了个用于查询扇贝网词典的workflow,发布在github上了。

关键词:sb 哈哈~

demo

还不是很完善,主要因为扇贝比较变态,必须登陆才能查词,用到了requests模块,但是这个模块不是python自带的,需要手动安装

也就是说现在这个workflow还无法推出去给网友用。。改天有空改一下,去掉requests模块。

后面会加上添加生词到单词本功能。

地址: https://github.com/henter/Shanbay-Alfred2

Mac下快速切换代理设置(为方便翻墙)

自从换到Mac系统后,一直在用GoAgent翻墙,方便快捷。

但是有个问题就是,翻墙后访问国内网站速度比较慢,比较不爽。

PS,虽然此问题可以用goagent结合pac文件实现智能翻墙,但不在本文讨论之列。以后再折腾这个。

所以,现在的办法是,需要翻墙的时候,在网络设置里面勾选代理,如下图: Mac代理设置

但是每次这样设置,比较麻烦,google之后,发现可以用网络设置里面的“位置(Location)”实现,即通过设置不用的位置,采用不同的设置方案,这样只要切换位置就可以了。如下图 Mac切换位置

但是!

这样还是有个问题,每次切换之后都会断网,然后重新联网,也很不爽。

然后我就想,能否快速修改代理设置呢?

经过一番搜索,找到了在命令行下快速修改网络设置的方法

让“Wi-Fi”这个网络链接打开WEB代理(HTTP)

sudo networksetup -setwebproxystate 'Wi-Fi' on

让“Wi-Fi”这个网络链接打开WEB代理(HTTPS)

sudo networksetup -setsecurewebproxystate 'Wi-Fi' on

关闭时,把on改为off即可。 其它网络服务要把Wi-Fi改成对应的名称。

剩下的就简单了,把命令写入sh文件,通过设置alias快速调用。

例如我的:

proxy.sh

#!/bin/zsh

#默认 开https  不开http
proxy_on(){
   networksetup -setsecurewebproxystate 'Wi-Fi' on
   networksetup -setwebproxystate 'Wi-Fi' off
}

#关闭代理
proxy_off(){
   networksetup -setsecurewebproxystate 'Wi-Fi' off
   networksetup -setsecurewebproxystate 'Wi-Fi' off
}

#打开http和https代理
proxy_all(){
   networksetup -setsecurewebproxystate 'Wi-Fi' on
   networksetup -setsecurewebproxystate 'Wi-Fi' on
}

if [ "$1" = "on" ]; then
	proxy_on
elif [ "$1" = "off" ]; then
	proxy_off
elif [ "$1" = "all" ]; then
	proxy_all
else
	printf "Usage: sh ~/.dotfiles/sh/proxy.sh {on|off|all}\n"
fi

然后,修改.zshrc,加入别名

# proxy切换
alias proxy="sudo sh ~/.dotfiles/sh/proxy.sh on"
alias proxy_off="sudo sh ~/.dotfiles/sh/proxy.sh off"
alias proxy_all="sudo sh ~/.dotfiles/sh/proxy.sh all"

修改完后,重新载入

source .zshrc

现在,就可以通过 proxy proxy_off proxy_all来自由切换代理设置了。

PS: 不习惯命令行的童鞋可以用我前面提到的智能翻墙方案,搜索mac goagent pac


参考:

Mac OS X中通过程序修改系统网络设置的proxies

https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/networksetup.8.html

Fork me on GitHub