zoukankan      html  css  js  c++  java
  • Python:读写文件(I/O) | 组织文件

    1. I/O 概述 

       程序与用户交互涉及到程序的输入输出(I/O)

      一种类型是字符串,通过input() print() 函数以及数据类型转换类函数如(int()),实现数据的输入输出。

      另一种类型是读写文件,通过文件的创建、读和写,实现数据的输入输出。

      本文叙述关于读写文件与组织文件 

    2. 文件与文件路径

    2.1  文件及文件类型

      2.1.1 文件

       文件是一个的序列,可被应用程序翻译成文本文件和二进制文件。

      是存储在计算机中的最小单位,位代表设备的某一状态,但只能是两种状态之一(设备开关断开或合上)。

      文件可分类为文本文件和二进制文件

      2.1.2 文本文件

      文本文件是字符文件,只含有ASCII或Unicode字符,要存储整数、浮点数或其他数据结构,必须要将它们转化成对应的字符格式。

      2.1.3 二进制文件

      二进制文件是其他所有文件。诸如字处理文档、 PDF、 图像、 电子表格和可执行程序。

    2.2  文件路径

       文件以文件夹 (folder)的形式组织起来。文件夹也叫目录(directory)。

      每个正在运行的程序都有一个 ‘‘当前目录”作为大多数操作的默认目录。例如,当你打开一个文件来读取时,Python 会在当前目录下寻找这个文件。

      指明一个文件或者目录的字符串,叫做路径 (path),比如:'/Python36/scripts'

      os 模块提供了操作文件和目录的函数。

      2.2.1 相对路径

       一个简单的文件名,如 memo.txt ,同样被看做是一个路径,只不过是相对路径  ,因为它是相对于当前目录而言的。相对路径(relative path)就是从当前目录开始的路径。

      下面代码揭示了 os.path.exists() 的实际

    >>> import os 
    >>> os.getcwd()  # getcwd() 返回当前工作目录
    'D:\Python36'
    >>> os.chdir('C:\Windows\System32')  # chdir() 切换当前目录
    >>> os.getcwd()
    'C:\Windows\System32'
    >>> import os
    >>> os. path . exists ('(读写文件)疯狂填词2.txtt ') # 这个文件在计算机上存在,但不存在当前目录
    False
    >>> os.path.exists('正则代码实践strip.py') # 这个文件存在当前目录
    True

      2.2.2 绝对路径

      一个以 开头的路径和当前目录无关,叫做绝对路径 绝对路径 (absolute path)就是从文件系统顶部开始的路径。

        下面代码揭示了 os.path.abspath() 的实际效果以及 os.path.relpath() 的用法

    >>> import os
    >>> os.path.abspath('正则代码实践strip.py')
    'D:\Python36\正则代码实践strip.py'
    >>> import os
    >>> os.path.abspath('正则代码实践strip.py')
    'D:\Python36\正则代码实践strip.py'
    >>> os.path.abspath('(读写文件)疯狂填词2.py') # 这个文件是当前目录没有的
    'D:\Python36\(读写文件)疯狂填词2.py'
    >>> os.path.abspath(r'Python编程快速上手++让繁琐工作自(读写文件)疯狂填词2.py') # 这个目录也是当前目录不存在的
    'D:\Python编程快速上手++让繁琐工作自\(读写文件)疯狂填词2.py'
    >>> os.path.abspath(r'DesktopPython编程快速上手++让繁琐工作自动化(读写文件)疯狂填词2.py')
    'D:\Desktop\Python编程快速上手++让繁琐工作自动化\(读写文件)疯狂填词2.py'
    >>> os.path.abspath(r'AdministratorDesktopPython编程快速上手++让繁琐工作自动化(读写文件)疯狂填词2.py')
    'D:\Administrator\Desktop\Python编程快速上手++让繁琐工作自动化\(读写文件)疯狂填词2.py' # 如果没有指明最顶部根目录,则该函数返回的目录的顶部都是当前目录的顶部,即"D:\"
    >>> os.path.abspath(r'C:UsersAdministratorDesktopPython编程快速上手++让繁琐工作自动化(读写文件)疯狂填词2.py')
    'C:\Users\Administrator\Desktop\Python编程快速上手++让繁琐工作自动化\(读写文件)疯狂填词2.py'
    >>> import os
    >>> os.path.relpath('C:\Windows', 'C:\')
    'Windows'
    >>> os.path.relpath('C:\Windows', 'C:\spam\eggs')
    '..\..\Windows'
    >>> os.getcwd()
    'D:\Python36'

      2.2.3 用 os.makedirs() 创建新文件夹(目录)

      os.makedirs()将创建所有必要的中间文件夹,目的是确保完整路径名存在。

    >>> import os
    >>> os.makedirs('D:\abc\def\g')
    >>> os.chdir(('D:\abc\def\g')

      2.2.4  用 os.path.join() 构建所有操作系统上都有效的路径

      这个方法很有用,例如构建文件路径(创建文件的同时创建路径)

    >>> import os
    >>> os.path.join('D:\Python36', 'test.txt')
    'D:\Python36\test.txt'

    3. 读写文件

    3.1  用 open() 函数创建或打开文件

      open() 函数返回一个 File 类型对象,将该对象保存于变量中,就可以调用 File 对象的方法

    >>> file = open('hello.txt')

      如果当前目录下没有 'hello.txt' 文件,则创建该文件并打开。

    3.2  read() 或 readlines()方法读取文件

       open() 函数默认以“读”模式打开文件,因此不能进行写入操作,但可以用 read() 方法读取文件内容(但要实现下面代码结果,先要手动打开文件,并敲入对应的内容),

      read() 方法就返回保存在该文件中的字符串。

      readlines() 方法,从文件取得一个字符串的列表。列表中的每个字符串就是文本中的每一行。

    >>> helloContent = file.read()
    >>> helloContent
    'Hello world!'
    >>> sonnetFile = open('sonnet29.txt')
    >>> sonnetFile.readlines()
    [When, in disgrace with fortune and men's eyes,
    ', ' I all alone beweep my
    outcast state,
    ', And trouble deaf heaven with my bootless cries,
    ', And
    look upon myself and curse my fate,']

    3.3  write()方法写入文件

      'w'作为第二个参数传递给 open(),将以写模式打开该文件,便可以调用 write() 方法将内容写入文件。

      'w' 模式将会删除文件原有内容,重新写入。

      如果不希望删除原有内容,可以用 'a' 模式将内容以添加的方式写入文件。

      还有二进制写入模式 'wb' 等,更多模式请参考Python文档。

    >>> baconFile = open('bacon.txt', 'w')
    >>> baconFile.write('Hello world!
    ')
    13
    >>> baconFile.close()
    >>> baconFile = open('bacon.txt', 'a')
    >>> baconFile.write('Bacon is not a vegetable.')
    25
    >>> baconFile.close()
    >>> baconFile = open('bacon.txt')
    >>> content = baconFile.read()
    >>> baconFile.close()
    >>> print(content)
    Hello world!
    Bacon is not a vegetable.

      write() 返回值是被写入字符的个数。文件对象将跟踪自身的位置,所以下次你调用 write的时候,它会在文件末尾添加新的数据。

    3.4 修改文件

      调用 readlines() 方法,利用正则表达匹配修改内容或调用字符串相关方法修改内容,重新写入新文件。备份原文件,删除原文件。

    3.5  colse() 方法关闭文件

      如果用上下文管理器(with语句)则不需要调用colse()方法,否则应该在最后调用colse()方法。

    >>> baconFile = open('bacon.txt', 'w')
    >>> baconFile.write('Hello world!
    ')
    13
    >>> baconFile.close()

    4. 组织文件

      参考自《Python编程快速上手  让繁琐工作自动化》

    4.1 查看目录下所有文件

      调用 os.listdir(path) 将返回传入函数路径(path)下所有文件名字符串的列表,包含 path 中的每个文件

    >>> os.listdir('C:\Windows\System32')
    ['0409', '12520437.cpx', '12520850.cpx', '5U877.ax', 'aaclient.dll',
    ......
    'xwtpdui.dll', 'xwtpw32.dll', 'zh-CN', 'zh-HK', 'zh-TW', 'zipfldr.dll']

    4.2 遍历目录树

      os.walk()在循环的每次迭代中,返回 3 个值:
      1. 当前文件夹名称的字符串。
      2. 当前文件夹中子文件夹的字符串的列表。
      3. 当前文件夹中文件的字符串的列表。

    import os
    
    for folderName, subfolders, filenames in os.walk('C:\delicious'):
        print('当前目录(文件夹) folder 是 ' + folderName)
            for subfolder in subfolders:
                print('目录下子文件夹 subflder 是 ' + folderName + ': ' + subfolder)
            for filename in filenames:
                print('目录下文件 file 是 ' + folderName + ': '+ filename)
            print('')    

      输出如下,意思就是os.walk(),先搜索文件夹(根目录)下的所有子文件夹和文件,而对根目录下的每个子文件夹又做了同样的事情,层次迭代,结果就是找到了所有的文件夹与文件(即遍历了目录树)

    当前目录文件夹 folder 是 C:delicious
    目录下子文件夹 subflder 是 C:delicious: cats
    目录下子文件夹 subflder 是 C:delicious: walnut
    目录下文件 file 是 C:delicious: spam.txt
    
    当前目录文件夹 folder 是 C:deliciouscats
    目录下文件 file 是 C:deliciouscats: catnames.txt
    目录下文件 file 是 C:deliciouscats: zophie.jpg
    
    当前目录文件夹 folder 是 C:deliciouswalnut
    目录下子文件夹 subflder 是 C:deliciouswalnut: waffles
    当前目录文件夹 folder 是 C:deliciouswalnutwaffles
    目录下文件 file 是 C:deliciouswalnutwaffles: butter.txt.

    4.3 shutil 模块

      4.3.1 复制文件和文件夹

      调用 shutil.copy() 

    >>> import shutil, os
    >>> os.chdir('C:\')
    >>> shutil.copy('C:\spam.txt', 'C:\delicious')
    'C:\delicious\spam.txt'
    >>> shutil.copy('eggs.txt', 'C:\delicious\eggs2.txt')
    'C:\delicious\eggs2.txt'

      4.3.2 文件和文件夹的移动与改名

      调用 shutil.move(source, destination), 下面代码:

      1、如果文件夹 C:eggs 中原来存在一个文件 bacon.txt,它会被C:\bacon.txt 覆盖(替换)。

      2、目标文件夹 C:\eggs 必须存在

      3、 shutil.move() 方法可以实现改文件名

    >>> import shutil
    >>> shutil.move('C:\bacon.txt', 'C:\eggs')
    'C:\eggs\bacon.txt'
    >>> shutil.move('C:\bacon.txt', 'C:\eggs\new_bacon.txt')
    'C:\eggs\new_bacon.txt'

      4.3.3永久删除文件和文件夹

      利用 os 模块中的函数,可以删除一个文件或一个空文件夹。但利用 shutil 模块,可以删除一个文件夹及其所有的内容。

      • 调用 os.unlink(path)将删除 path 处的文件。
      • 调用 os.rmdir(path)将删除 path 处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹。
      • 调用 shutil.rmtree(path)将删除 path 处的文件夹,它包含的所有文件和文件夹都会被删除。

      以上函数都是永久删除用时要特别小心

    import os
        for filename in os.listdir():
            if filename.endswith('.rxt'):
                #os.unlink(filename)
                print(filename)                

      4.3.4 用 send2trash 模块安全地删除

      send2trash() 函数只能将文件送到垃圾箱, 不能从中恢复文件。

    >>> import send2trash
    >>> baconFile = open('bacon.txt', 'a') # creates the file
    >>> baconFile.write('Bacon is not a vegetable.')
    25
    >>> baconFile.close()
    >>> send2trash.send2trash('bacon.txt')

    4.4.zipfile 模块

      4.4.1 读取 ZIP 文件  

    >>> import zipfile, os
    >>> os.chdir('C:\') # move to the folder with example.zip
    >>> exampleZip = zipfile.ZipFile('example.zip')
    >>> exampleZip.namelist()
    ['spam.txt', 'cats/', 'cats/catnames.txt', 'cats/zophie.jpg']
    >>> spamInfo = exampleZip.getinfo('spam.txt')
    >>> spamInfo.file_size
    13908
    >>> spamInfo.compress_size
    3828
    >>> 'Compressed file is %sx smaller!' % (round(spamInfo.file_size / spamInfo.compress_size, 2))
    'Compressed file is 3.63x smaller!'
    >>> exampleZip.close()

      4.4.2 解压文件 

       运行这段代码后, example.zip 的内容将被解压缩到 C:

      或者, 你可以向extractall()传递的一个文件夹名称,它将文件解压缩到那个文件夹, 而不是当前工作目录。 

    >>> import zipfile, os
    >>> os.chdir('C:\') # move to the folder with example.zip
    >>> exampleZip = zipfile.ZipFile('example.zip')
    >>> exampleZip.extractall()
    >>> exampleZip.close()

      4.4.3 创建和添加到 ZIP 文件

      下面代码 zipfile.ZipFile()方法中第二个参数 zipfile.ZIP_DEFLATED  是指定了 deflate 压缩算法,它对各种类型的数据都很有效

      这段代码将创建一个新的 ZIP 文件, 名为 new.zip, 它包含 spam.txt 压缩后的内容。

      和写入文件同样,写模式将擦除 ZIP 文件中所有原有的内容。如果只是希望将文件添加到原有的 ZIP 文件中, 就要向 zipfile.ZipFile()传入'a'作为第二个参数,以添加模式打开 ZIP 文件

    >>> import zipfile
    >>> newZip = zipfile.ZipFile('new.zip', 'w')
    >>> newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED)
    >>> newZip.close()
    作者:南宫恨

    正是江南好风景,落花时节又逢君

  • 相关阅读:
    C/C++优秀书籍清单
    C语言内存管理详解
    C/C++语言常用头文件及函数
    如何学好C++语言
    VS2010 更改MFC标题及标题栏图标和exe图标
    Vue 实现前进刷新,后退不刷新的效果 玩转vue-router里的meta
    $nextTick 页面局部刷新 延迟加载
    吸顶动画 侧边栏 监听滚动条位置 监听元素距离顶部高度
    vue 自定义侧边栏 递归无限子级菜单
    vue element NavMenu 莫名出现蓝色边框
  • 原文地址:https://www.cnblogs.com/ydkh/p/14680650.html
Copyright © 2011-2022 走看看