34.文件

1.常见的字符编码格式
  1. python的解释器在内存上使用Unicode。.py文件在磁盘上使用UTF-8存储,这是默认的。当然可以通过#encoding = 字符编码来更改在外存上使用的字符编码
    1. UTF-8:英文字符一个字节,通常一个汉字三个字节
2.常用的文件打开模式
  1. r:以只读模式打开文件,文件指针在文件的开头
  2. w:以只写模式打开文件,文件指针在文件的开头
  3. a:以追加模式打开文件
  4. b:以二进制方式打开文件,需要与其他模式一起使用
  5. +:以读写方式打开文件,需要与其他模式一起使用
3.文件对象的常用方法
  1. read:从文件中读取内容
  2. readline:从文本文件读取一行内容
  3. readlines:将文本文件每一行作为列表的一个元素,返回列表
  4. write:向文件写入内容
  5. writelines:将字符串列表写入文件
  6. seek:用于移动文件指针
  7. tell:返回文件指针的当前位置
  8. flush:将缓冲区的内容写入文件,不关闭文件
  9. close:将缓冲区的内容写入文件,关闭文件,释放文件对象相关资源
4.读文件的常用方法:
  1. read()方法
import os.path

#获取在当前工作目录下创建的ee.txt文件的绝对路径
path = os.path.abspath('ee.txt')
print(path) #E:\pythonProject\ee.txt

f = open(path,mode = 'r',encoding = 'utf-8')
content = f.read()
print(content)
f.close()
  1. read(n):在r模式下,n按照字符的个数读取;b模式时,代表读取n个字节
f = open(R'main.py',mode = 'r',encoding='utf-8')
content = f.read(20)    #包括换行符
print(content)          
f.close()

  1. readline():readline读取出来的每一行数据后面都有一个\n,Windows下
f = open(r'E:\pythonProject\ee.txt',mode = 'r',encoding='utf-8')
content1 = f.readline()
content2 = f.readline()
print(content1)
print(content2)
f.close()
# 输出如下
#import numpy as np

#import pandas as pd

解决上诉的问题如下:使用strip方法

f = open(r'main.py',mode = 'r',encoding='utf-8')
content1 = f.readline().strip('\n')
content2 = f.readline().strip('\n')
print(content1)
print(content2)

f.close()
  1. readlines()方法:
f = open(r'main.py',mode = 'r',encoding='utf-8')
list1 = f.readlines()
print(list1)

f.close()
# ['import numpy as np\n', 'import pandas as pd\n']
  1. 使用for循环去读取,调用open函数返回的文件句柄是一个迭代器,他的特点就是每次循环只在内存中占一行的数据,非常节省内存。注意:上面四种方法都不太好,因为如果文件很大会撑爆内存
f = open(r'main.py',mode = 'r',encoding='utf-8')
for line in f:
    print(line.strip()) #这种方式就是在一行一行的进行读取

f.close()
# import numpy as np
# import pandas as pd
5.文件操作的其他模式:
  1. 打开文件的模式有(默认为文本模式):

    1. r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
    2. w,只写模式【不可读;不存在则创建;存在则清空内容】
    3. a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】
  2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jpg格式、视频文件的avi格式)

    1. rb:主要是操作非文字文件:图片,音频,视频等
    2. wb:主要是操作非文字文件:图片,音频,视频等
    3. ab
      注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
  3. ‘+’模式(就是增加了一个功能)

    1. r+, 读写【可读,可写】
    2. w+,写读【可写,可读】
    3. a+, 写读【可写,可读】
  4. 以bytes类型操作的读写,写读,写读模式

    1. r+b, 读写【可读,可写】
    2. w+b,写读【可写,可读】
    3. a+b, 写读【可写,可读】
6.with语句(上下文管理器)
  1. with语句可以自动管理上下文资源,不论什么原因跳出with块。都能确保文件正确的关闭,以此来达到释放资源的目的。这和cpp中的智能指针的功能一致,不需要程序员手动释放资源。
  2. with语句的语法:
with 语句块 as 变量
    with语句体
  1. 简单示例:
#with语句可以让我们不用手动关闭文件对象相关资源
with open('aaa.txt','w') as file:
    file.write('HelloWorld')
7.目录操作
  1. os模块与os.path模块用于对文件或者目录操作
  2. os模块下与操作目录相关的函数:
    1. getcwd:返回当前的工作目录
    2. listdir:返回指定路径下的文件和目录信息
    3. mkdir:创建目录
    4. makedirs:创建多级目录
    5. removedirs:删除多级目录
    6. chdir:将指定的路径设置为当前工作目录
    7. os.curdir:返回当前目录
    8. os.pardir:获取当前目录的父目录字符串名
    print(os.curdir)    #'.'
    print(os.pardir)    #'..'
    
    1. os.remove():删除一个文件
    2. os.rename("oldname","newname") 重命名文件/目录
    3. os.stat('path/filename') 获取文件/目录信息
    import os
    
    # 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" 
    # 和操作系统差异相关
    print(os.sep)   #\
    
    # 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n" 
    print(os.linesep)
    
    # 输出用于分割文件路径的字符串 win下为;,Linux下为:
    print(os.pathsep)   #;
    
    # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    print(os.name)      #nt
    
    # os.popen("bash command).read()  运行shell命令,获取执行结果
    
    # 获取系统环境变量
    print(os.environ)
    
    
    #os模块:与操作系统相关的模块
    import os
    #打开Windows下的记事本
    #os.system('notepad.exe')
    #os.system('calc.exe')
    #直接调用可执行文件
    #os.startfile('D:\\QQ\\Bin\\qq.exe')
    
    #获取当前工作目录
    print(os.getcwd())  #E:\pythonProject
    #返回指定路径下的文件和目录
    print(os.listdir('./'))
    
  3. os.path模块操作目录相关的函数
    1. os.path.split():将path分割成目录和文件名以二元组返回。
    2. os.path.isabs(path):如果path是绝对路径就返回true
    3. os.path.isfile(path):如果path是一个存在的文件,返回true否则返回false。
    4. os.path.getatime(path):返回path所指向的文件或者目录的最后访问时间
    5. os.path.getmtime(path):返回path所指向的文件或者目录的最后修改时间
    6. os.path.getsize(path) 返回path的大小
    import os.path
    #获取绝对路径
    print(os.path.abspath('main.py'))   #E:\pythonProject\main.py
    #判断文件或者目录是否存在
    print(os.path.exists('aaa.txt'),os.path.exists('main.py'))  #true true
    #将目录名与文件名拼接起来
    print(os.path.join('E:\\example','aaa.txt'))    #E:\example\aaa.txt
    #将目录名与文件名分离
    print(os.path.split('E:\\example\\aaa.txt'))    #('E:\\example', 'aaa.txt')
    #将文件名与扩展名分离
    print(os.path.splitext('E:\\example\\aaa.txt')) #('E:\\example\\aaa', '.txt')
    #从一个目录中提取文件名
    print(os.path.basename('E:\\example\\aaa.txt')) #aaa.txt
    #从一个路径中提取文件路径,不包括文件名
    print(os.path.dirname('E:\\example\\aaa.txt'))  #E:\example,相当于os.path.split('E:\\example\\aaa.txt')[0]
    print(os.path.isdir('E:\\pythonProject'))   #true
    
    #获取指定目录下的以后缀名.py结尾的文件
    import os
    #获取当前工作目录
    path = os.getcwd()  #E:\pythonProject
    #获取当前工作目录下的所有文件
    lst = os.listdir(path)
    for fileName  in lst:
        if fileName.endswith('.py'):
            print(fileName)
    
    1. walk()方法:可以遍历指定目录下的所有文件和子目录下的所有文件
    2. basename:从一个目录中提取文件名
    3. dirname:从一个路径中提取文件路径,不包括文件名
    4. isdir:用于判断是否为路径
    5. splitext:分离文件名和扩展名
    6. join:将目录与目录或者文件名拼接起来
    7. exists:用于判断文件或者目录是否存在
    8. abspath:用于获取文件或者目录的绝对路径