跳至主要內容

IO编程:操作目录

yczha大约 4 分钟python基础python语法python

Python基础系列内容为学习廖雪峰老师Python3教程的记录,廖雪峰老师官网地址:廖雪峰Python3教程open in new window

  • os 模块:Python提供了os模块来支持对文件的操作,下面列举部分比较常见的操作

    • 获取系统类型

      import os
      print(os.name)
      # 输出结果
      # nt
      # [Finished in 0.2s]
      

      os.name会获取系统的类型,nt 代表的是Windows系统,而posix 代表Linux Unix 或者Mac OS X

    • 获取环境变量

      import os
      print(os.environ)
      # 输出结果
      environ({'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'PROMPT': '$P$G', 'PYTHONIOENCODING': 'utf-8', ...})
      [Finished in 0.2s]
      

      系统的环境变量都会储存在这个变量中,如果要获取某个变量的值,可以调用方法:os.environ.get() 方法:

      import os
      print(os.environ.get("Path"))
      # 输出结果
      C:\Users\fanyu\Anaconda3\Library\bin;C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;....
      [Finished in 0.1s]
      
    • 创建文件或目录

      import os
      parent=os.path.abspath(".")#获取当前路径的绝对路径地址
      print(parent)# 输出当前路径绝对路径
      new_folder_path=os.path.join(parent,'testdir')# 新的文件夹绝对路径
      print(new_folder_path)
      flag=os.path.isdir(new_folder_path) # 判断是否存在该目录
      print(str(flag))
      os.mkdir(new_folder_path) # 创建该目录
      flag=os.path.isdir(new_folder_path) # 判断创建的目录是否存在
      print(str(flag))
      os.rmdir(new_folder_path) # 移除目录
      flag=os.path.isdir(new_folder_path) #
      print(flag)
      

      输出结果:

      D:\data\schoolwork\code
      D:\data\schoolwork\code\testdir
      False
      True
      False
      [Finished in 0.2s]
      

      我们来分析上面的代码:

      首先程序获取当前目录的绝对路径并打印出来:D:\data\schoolwork\code

      接下来程序使用os.path.join() 函数拼接出一个新的地址:D:\data\schoolwork\code\testdir

      然后用os.path.isdir() 来判断该目录是否存在: False

      紧接着程序创建了该目录:os.mkdir(new_folder_path) # 创建该目录 再判断其是否存在:True

      最后程序移除了该目录: os.rmdir(new_folder_path) # 移除目录

      这里要说明几个函数,能够方便程序开发

      • os.path.split() :这个函数能将一个路径按照系统的不同将路径划分为两个部分,一个是其父路径,另一个为其文件名全称

      • os.path.splitext() :这个函数能把一个路径按照后缀分开

        import os
        path="C:/users/fanyu/desktop/test.txt"
        print("split result:\n",os.path.split(path))
        print("splitext result:\n",os.path.splitext(path))
        # 输出结果
        split result:
         ('C:/users/fanyu/desktop', 'test.txt')
        splitext result:
         ('C:/users/fanyu/desktop/test', '.txt')
        [Finished in 0.1s]
        
      • os.path.join():该函数能根据系统的不同将路径拼接起来

        import os
        path=os.path.join("c:/users/fanyu/desktop",'test.txt')
        print(path)
        # 结果
        c:/users/fanyu/desktop\test.txt
        [Finished in 0.1s]
        
      • os.rename() :对文件重命名

      • os.remove(): 删除文件

    • 由于os 模块所提供的函数都是对系统封装的调用,因而如果某功能,比如文件复制,没有相应的系统调用的话os 模块也就没有相应的函数,基于此,Python提供了 shutil 模块来作为os 模块的补充,来提供一些别的文件操作相关的函数,比如复制文件shutil.copyfile 比如删除非空目录shutil.rmtree

  • 序列化:把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling ,在其他语言中也被称之为serializationmarshallingflattening等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。Python提供了pickle 模块来进行序列化操作

    • pickle.dumps():序列化操作

      import pickle
      d=dict(name='Lisa',score=100,age=20)
      print(pickle.dumps(d))
      # 输出结果:
      b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Lisaq\x02X\x05\x00\x00\x00scoreq\x03KdX\x03\x00\x00\x00ageq\x04K\x14u.'
      [Finished in 0.2s]
      

      可以看到该函数将一根dict 对象序列化为了二进制的数据(这里显示为16进制)

    • pickle.dump():将对象序列化后保存为文件

      import pickle
      d=dict(name='Lisa',score=100,age=20)
      f=open("test.txt","wb")
      pickle.dump(d,f)
      f.close()
      
    • pickle.load(): 反序列化:将序列从文件还原

      import pickle
      f=open("test.txt","rb")
      print(pickle.load(f))
      f.close()
      #结果
      {'name': 'Lisa', 'score': 100, 'age': 20}
      [Finished in 0.2s]
      

      可见变量又被加载回来了。另外值得提起的时是,这种序列化是高度依赖语言甚至是语言版本的,可能不同版本的Python序列化的结果都不一样,鉴于此,有为了跨平台,多兼容的序列化标准:比如json xml 等。但更好的方法是序列化为json,因为json表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。json不仅是标准格式,并且比xml更快,而且可以直接在Web页面中读取,非常方便。

  • json :使用json 进行序列化也非常方便

    import json
    d={"name":"Lisa","sroce":99,"age":20,"gender":"female"}
    print(json.dumps(d))
    #结果
    {"name": "Lisa", "sroce": 99, "age": 20, "gender": "female"}
    [Finished in 0.2s]
    

    加载同样也很方便:

    import json
    d={"name":"Lisa","sroce":99,"age":20,"gender":"female"}
    json_str=json.dumps(d)
    dd=json.loads(json_str)
    print(dd)
    {'name': 'Lisa', 'sroce': 99, 'age': 20, 'gender': 'female'}
    [Finished in 0.2s]