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()

 

posted @ 2019-10-13 16:41  汉学  阅读(84)  评论(0编辑  收藏  举报