Python进阶技巧汇总02
总结自原创: Leoxin 菜鸟学Python
原文地址:强烈推荐|麻烦刚关注2699名小伙伴一定要看,信息量太大
1 函数
- 如何避开变量作用域的陷阱:
先思考一个例子,问最后X的值是多少?
x=99
def func1():
global x
x=88
def func2():
global x
x=77
首先,全局变量是位于模块文件内部的顶层的变量名,如何是在函数内被改变的话,一定要用global关键字,全局变量名在函数内部不经过声明也可以被引用。其次,函数内的变量解析原则(LEGB法则),当在函数中使用没有声明过的变量时,python的搜索顺序是:
- 先是在函数内部的本地作用域(L)
- 然后是在上一层的函数的本地作用域(E)
- 然后是全局作用域(G)
- 最后是内置作用域(B)
最后,上述X的值不是88也不是77,而是都有可能,因为不确定先调用哪个函数,变量的值取决于函数调用的顺序,而函数自身是任意顺序进行排列的,所以88,77都有可能,看哪个函数最后调用.
2 文件处理基础
- Python文件常用的场景和用法:
具体应用场景包括:文件的处理、文件路径的处理、创建并访问目录、判断是否为文件或者目录
(1)文件处理
假设在当前目录下有一个'abc.txt',下面所有操作都要import os
- 重命名文件
os.rename('abc.txt','a123.txt')
>>'abc.txt'变成了'a123.txt'
- 删除文件
os.remove('a123.txt')
# 但是在删除之前,最好先判断'a123.txt'是否存在,改成:
if os.path.exists('a123.txt'):
os.remove('a123.txt')
(2)文件路径的处理
假设有一个文件路径path='/users/Python/Data/info.txt'
- 获得路径
print os.path.dirname(path)
>>>/users/Python/Data
- 分割文件名
print(os.path.basename(path))
>>>info.txt
- 分割文件的后缀
print(os.path.split(path))
>>>('/users/Python/Data', 'info.txt')
(3)创建并访问目录
假设创建一个test01,test02目录
- 创建目录
os.mkdir('test01') # 在当前目录下创建一个test01目录
os.mkdir('test02') # 在当前目录下创建一个test02目录
# 改进,最好在创建之间先判断目录是否存在,否则会报错
if not os.path.exists('test01'):
os.mkdir('test01')
if not os.path.exists('test02'):
os.mkdir('test02')
- 列出当前目录下的所有文件和文件夹
|---test01--------
|---test02--------
|---demo_file.py--
print(os.listdir('.'))
>>>['demo_file.py', 'test01', 'test02']
print(list(os.walk('.'))) == # walk()会生成当前目录下的所有文件和目录==
>>>[('.', ['test01', 'test02'], ['demo_file.py']), ('.\test01', [], []), ('.\test02', [], [])]
- 返回当前的目录
print(os.getcwd())
>>>C:UsersxxPythonTest
- 删除目录
os.rmdir('test02') # 如果里面还有其他文件和目录,要一并删除,可以用高级模块shutil来处理
(4)判断是否为文件或者目录
假设我们有和(3)一样的目录结构
- 判断是否为文件
print(os.path.isfile('test01'))
>>>False
print(os.path.isfile('demo_file.py'))
>>True
- 判断是否为目录
print(os.path.isdir('test01'))
>>True
- 判断文件或者目录是否存在
print(os.path.exists('demo_file.py'))
>>True
print(os.path.exists('test01'))
>>True
3 文件处理进阶技巧
- 如何对多个文件中的内容替换,假设在当前目录下有2个文件test01.txt,test02.txt我们需要把里面的Java全部替换为Python,一次搞定怎么做呢?
|--test01.txt---
Hi All,
What Is Java?
What Is Programming?
|--test02.txt---
Hi All,
Why do people use Java?
It’s an important tool to learn
# Python标准库里面的fileinput模块允许你循环一个或多个文本文件的内容,非常实用
import fileinput
import glob
# 利用glob模块过滤出当前目录下所有的txt文件
# inplace=1 标准输出,比如print会被重定向到打开文件
# 把每一行去掉回车,然后把java替换为Python
for line in fileinput.input(glob.glob('*.txt'),inplace=1):
print(line.strip().replace('Java','Python'))
fileinput.close() # 关闭文件句柄
- 如何列出全目录结构?(用python内置模块的os.walk()函数)
假如我们有这样的一个目录结构为'C:myPython',结构如下:
|---demo---
|--demo_01.exe
|--demo_02.msi
|--other
|--info.docc
|---log-----
|--1110_log.txt
|--1111_log.txt
|--1112_log.txt
|---pic-----
|--0127_1.jpg
|--0127_2.jpg
|--0127_3.jpg
import os
path=r'C:myPython'
for folderName,subfolders,filenames in os.walk(path):
print 'The current folder is :'+folderName
for subfolder in subfolders: # 列出子目录
print ('Subfolder of '+folderName+': '+subfolder)
for file_name in filenames: # 列出文件
print ('File insdie '+folderName+': '+file_name)
>>>
The current folder is :C:myPython
Subfolder of C:myPython: demo
Subfolder of C:myPython: log
Subfolder of C:myPython: pic
The current folder is :C:myPythondemo
Subfolder of C:myPythondemo: other
File insdie C:myPythondemo: demo_01.exe
File insdie C:myPythondemo: demo_02.msi
The current folder is :C:myPythondemoother
File insdie C:myPythondemoother: info.docx
The current folder is :C:myPythonlog
File insdie C:myPythonlog: 1110_log.txt
File insdie C:myPythonlog: 1111_log.txt
File insdie C:myPythonlog: 1112_log.txt
The current folder is :C:myPythonpic
File insdie C:myPythonpic: 0127_1.jpg
File insdie C:myPythonpic: 0127_2.jpg
File insdie C:myPythonpic: 0127_3.jpg
- 如何把多个文件copy到另外一个目录下?(用高级文件模块shutil搞定)
假如我们当前目录下有这样一个文件结构,我们想把test01.txt和text02.txt备份到backup下,怎么办:
|---backup---
|--abc.txt
|---test01.txt---
|---test02.txt---
# 列出所有的文件
# 过滤出txt文件
# copy到backup下
import shutil,os
for file in os.listdir('.'):
if os.path.splitext(file)[1]=='.txt':
shutil.copy(file,os.path.join('backup',file))
# 创建了backup2目录,然后把backup下的文件全部都copy过来
shutil.copytree('backup', 'backup2')
- 删除目录以及所有子目录的文件
# 若这个目录下面有文件,或者不为空,直接用os.rmdir('backup2'),会报错,告诉你:The directory is not empty: 'backup2'
# 用这个
shutil.rmtree('backup2')