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')
    
  • 相关阅读:
    Linux下sed,awk,grep,cut,find学习笔记
    Python文件处理(1)
    KMP详解
    Java引用详解
    解决安卓中页脚被输入法顶起的问题
    解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
    null id in entry (don't flush the Session after an exception occurs)
    HQL中的Like查询需要注意的地方
    spring mvc controller间跳转 重定向 传参
    node to traverse cannot be null!
  • 原文地址:https://www.cnblogs.com/luowei2018/p/10181761.html
Copyright © 2011-2022 走看看