Python 学习笔记
剪贴板操作 pyperclip
# 将字符串复制到剪贴板 pyperclip.copy(str) # 从剪贴板取得内容 str = pyperclip.copy()
正则表达式
查找第一处匹配
ret = re.search(pattern, string, re.I | re.DOTALL)
未查找到匹配时返回 None,匹配成功返回一个 Match 对象,Match 对象不能直接引用,必须使用 ret.group() 或 ret.group(0) 取得整个正则式匹配到的字符串。如果 pattern 中有分组,可以使用 ret.group(1),ret.group(2)……来取得各个分组的匹配值。
search 函数查找到第一处匹配后就会结束查找,因此在使用 * 号时尤其要注意,可能会匹配到一个空字符串而中止匹配,比如:
ret = re.search(r'[\d.]*', 'abc12.345world')
查找全部匹配
ret = re.findall(pattern, string, re.I | re.DOTALL)
返回值为匹配到的全部结果的列表,如果 pattern 中不含分组,那么返回的列表中的每一项就是匹配到的字符串;如果 pattern 中包含分组,那么返回的列表中的每一项是各个分组匹配值组成的元组。比如:
>>>re.findall(r'\d*\.\d*', 'hello12.345world3.142python') ['12.345', '3.142'] >>>re.findall(r'(\d*)\.(\d*)', 'hello12.345world3.142python') [('12', '345'), ('3', '142')]
替换
str = re.sub(pattern, repl, string, count=0, flags=0)
count 为替换次数,默认值 0 表示替换全部匹配。
在替换字符串 repl 中,可以使用 \1, \2 ……引用 pattern 中的分组,如
>>>str = 'Agent Alice told Agent Carol that Agent Bob was a double agent.' >>>ret = re.sub(r'(Agent \w)\w+\b', r'\1***', str) >>>print(ret) Agent A*** told Agent C*** that Agent B*** was a double agent.
文件与路径
sys模块
取得当前脚本路径
sys.path[0]
取得命令行参数
# 当以 python d:\test.py 111 222 方式执行时,将得到 # ['d:\\test.py', '111', '222'] params = sys.argv
os模块
取得当前工作目录
path = os.getcwd()
切换当前工作目录
os.chdir('c:\\python34\\lib')
逐级创建文件夹(给定路径中不存在的文件夹将逐级创建)
os.makedirs('c:\\killme\\test\\2')
返回指定文件夹中的文件名列表
需要注意的是:指定文件夹中的文件及子目录都将取到列表中,只包含文件名,不是全路径。此函数不搜索子文件夹,只搜索本级文件夹。
filelist = os.listdir('c:\\windows\system32')
遍历文件夹
for currentFolder, subFoldersList, filesList in os.walk(path): print(currentFolder, subFoldersList, filesList)
对于下面的目录结构,
C:\1 │ b.txt │ c.txt ├─11 │ │ a.txt │ ├─111 │ │ d.doc │ └─112 │ e.doc └─12 test.py
打印的结果如下:
c:\1 ['11', '12'] ['b.txt', 'c.txt']
c:\1\11 ['111', '112'] ['a.txt']
c:\1\11\111 [] ['d.doc']
c:\1\11\112 [] ['e.doc']
c:\1\12 [] ['test.py']
os.path模块
路径组合
>>>os.path.join('usr', 'bin', 'spam') 'usr\\bin\\spam'
转换为绝对路径
path = os.path.abspath(相对路径)
转换为相对路径
path = os.path.relpath(绝对路径, 起始目录)
判断是否为绝对路径
os.path.isabs(路径名)
从文件全路径中分解取得路径名与文件名
fullpath = 'c:\\windows\\system32\\calc.exe' path = os.path.dirname(fullpath) filename = os.path.basename(fullpath) # os.path.split() 函数可以从全路径中同时得到路径与文件名 path, filename = os.path.split(fullpath)
路径分隔符常量
>>>os.path.sep '\\'
取得文件大小(如果传入文件夹,则返回0;如果文件不存在,将引发异常)
os.path.getsize(file)
文件或文件夹是否存在
os.path.exists(path)
如果目标存在,并且是一个文件
os.path.isfile(path)
如果目标存在,并且是一个文件夹
os.path.isdir(path)
文件操作
复制单个文件
ret = shutil.copy(source, destination)
如果 destination 是文件名,则将源文件复制为新文件名;如果 destination 是文件夹,则将源文件复制到指定文件夹中。
destination 指定的文件夹必须存在,否则将抛出异常。
返回值:新复制文件的全路径
复制文件夹
ret = shutil.copy(source, destination)
只对 source 下的文件及子文件夹复制,source 本级文件夹名称不会复制到目的文件夹中。
destination 中指定的文件夹如果不存在,将逐级自动创建。
返回值:新复制的文件夹的路径
文件或文件夹的移动与更名
ret = shutil.move(source, destination)
如果 destination 为文件夹,则源文件将移动到目标文件夹中;如果 destination 为文件名,则源文件将移动到目标文件夹并重命名。
destination 指定的文件夹必须存在,否则将抛出异常。
返回值:新位置的全路径
删除文件夹
# 直接删除文件夹下的全部文件及子文件夹,无法恢复。调试时最好先用 print(path) 代替,无误后再使用 rmtree shutil.rmtree(path) # 也可以使用 os 模块中的函数: # 删除单个文件 os.unlink(path) # 删除空文件夹 os.rmdir(path)
删除到回收站
# send2trash 是外部模块,需安装 # 需要注意的是,本函数不接受“/”作为目录分隔符,必须使用“\\” send2trash.send2trash(path)
用 shelve 模块保存变量
写入
data = ['test', 123, 456] aFile = shelve.open('mydata.sav') aFile['data'] = data aFile.close()
读取
aFile = shelve.open('mydata.sav') data = aFile['data'] aFile.close()
ZIP 文件操作
读取
zFile = zipfile.ZipFile('backup.zip') # 取得ZIP压缩包中的文件列表 fileList = zFile.namelist() # 取得ZIP压缩包的文件信息,以 aFile 为例 fileInfo = zFile.getinfo(aFile) print(fileInfo.file_size, fileInfo.compress_size) # 提取文件,如果不指定第二个参数,就解压到当前文件夹中。如果destination 不存在,将自动创建 zFile.extract(aFile, destination) # 提取全部文件,如果不指定参数,就解压到当前文件夹中。如果destination 不存在,将自动创建 zFile.extractall(destination) zFile.close()
写入
# 如果向原有压缩中添加文件,可使用 'a' 参数打开压缩包 zFile = zipfile.ZipFile('backup.zip', 'w') # 向压缩包中添加文件 zFile.write(aFlie, compress_type=zipfile.ZIP_DEFLATED) zFile.close()