zoukankan      html  css  js  c++  java
  • 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')
    
  • 相关阅读:
    [转]Java 反射在实际开发中的应用
    phantomjs生成网页快照,有些https 证书不支持问题解决
    PHP + TrackingMore物流信息跟踪
    rabbitMQ消息队列 – Message方法解析
    MySQL UNION 与 UNION ALL 语法与用法
    提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
    php商品对比功能代码分享
    Redis类的源码使用
    php+redis实现消息队列
    PHP中利用redis实现消息队列处理高并发请求
  • 原文地址:https://www.cnblogs.com/luowei2018/p/10181761.html
Copyright © 2011-2022 走看看