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')
原文地址:https://www.cnblogs.com/luowei2018/p/10181761.html