zoukankan      html  css  js  c++  java
  • 0703 Python OS 模块处理路径及文件处理

    一、os模块目录处理

    需要导入: import os

    import os
    # os 模块提供了非常丰富的方法用来处理文件和目录
    1.用于返回当前工作目录
    dir_name1 = os.getcwd()  # 打印:H:Pycharm_Projectslemon_20homework
    print('dir_name1:', dir_name1)
    
    2.获取操作系统名称
    print(os.name)  # 若是Windows系统会打印nt,若是linux/Unix会打印posix
    
    3.在某个路径下创建一个新目录
    # 相对路径, 相对当前py文件
    os.mkdir("test1")
    # 使用绝对路径来创建文件
    os.mkdir(r"H:Pycharm_Projectslemon_20homework\test2")
    
    4.删除目录
    os.rmdir("test1")
    
    5.删除文件
    os.remove('song1_new.mp3')
    
    6.获取当前路径下的目录列表
    print(os.listdir(r"H:Pycharm_Projectslemon_20homework"))
    # 第二种:
    print(os.listdir("."))
    
    7.打印当前模块所在目录的上级目录的目录列表
    print(os.listdir(".."))
    
    8.获取某个文件所在的目录路径
    dir_name2 = os.path.dirname(r"homework	est.py")
    dir_name3 = os.path.dirname(r"test.py")
    dir_name4 = os.path.dirname(r"sdafhjsdgasdjgldfgsdg431gsdhomework_0703.py")
    dir_name5 = os.path.dirname(r"sdafhjsdgasdjgldfgsdg431gsd	est.py")
    print('dir_name2:', dir_name2)
    print('dir_name3:', dir_name3)
    print('dir_name4:', dir_name4)
    print('dir_name5:', dir_name5)
    
    9.连接两个部分的路径,组成一个完整的路径
    print(os.path.join(r'H:Pycharm_Projectslemon_20homework	est.py', 'testcases'))
    
    10.判断某个路径是否存在
    result = os.path.exists(r"H:Pycharm_Projectslemon_20homeworkhua.py")
    print(result)
    
    11.判断某个目录是否存在
    result = os.path.isdir(r"H:Pycharm_Projectslemon_20homework	est")
    print(result)
    
    12.判断某个文件是否存在
    result = os.path.isfile("homework_0703.py")
    print(result)

    二、文件处理

    1.概念

    • 计算机中的文件,就是存储在某种长期储存设备上的一段数据
    • 长期存储设备包括:硬盘、U盘、移动硬盘、光盘...

    2.作用

    • 将数据长期保存下来,在需要的时候使用

    3.存储方式

    • 在计算机中,文件是以二进制的方式保存在磁盘上的

    4.分类

    • 文本文件
      • 可以使用文本编辑软件查看
      • 本质上还是 二进制文件
      • 例如: python 的源程序
    • 二进制文件
      • 保存的内容不是给人直接阅读的,而是提供给其他软件使用的  
      • 例如:图片文件、音频文件、视频文件等等  
      • 不能使用文本编辑软件查看  

    5.文件指针

    • 文件指针标记从哪个位置开始读取数据
    • 第一次打开文件时,通常文件指针会指向文件的开始位置
    • 当执行了read方法后,文件指针会移动到读取内容的末尾
      • 默认情况下会移动到文件末尾  

    6.打开制文件的方式

    • 默认以 只读方式 打开文件,并且返回文件对象

    语法:

    f = open("文件名","访问方式")
    • r:以 只读 方式打开文件。文件的指针将会放在文件的开头,这是默认模式。如果文件不存在,抛出异常
    • w:以 只写 方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件
    • a:以 追加 方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入
    • r+:以 读写 方式打开文件。文件的指针将会放在文件的开头。如果文件不存在,抛出异常
    • w+:以 读写 方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件
    • a+:以 读写 方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入
    • b :读写二进制文件(默认是t,表示文本),需要与上面几种模式搭配使用,如ab,wb, ab, ab+(POSIX系统,包括Linux都会忽略该字符)

    注意:频繁的移动文件指针,会影响文件的读写效率,开发中更多的时候会以只读、只写的方式来操作文件

    7.按行读取

    • read:方法默认会把文件的所有内容-次性读取到内存
    • 如果文件太大,对内存的占用会非常严重
    • 使用readline方法
    • readline方法可以一次读取一行内容
    • 方法执行后,会把文件指针移动到下一行,准备再次读取

    三、文件的读取与写入

    1、文件操作的步骤:

    • 1. 打开文件
    • 2. 读写操作
    • 3. 关闭文件

    2、读取文件 read

    使用read方法,会将文件中的所有内容读取出来, 以字符串类型呈现

    # 1. 打开文件
    one_file = open("test1.txt", encoding="utf-8")
    
    # 2. 读写操作
    # 使用read方法, 会将文件中的所有内容读取出来, 以字符串类型呈现
    content = one_file.read()
    print(content)
    
    # 3. 关闭文件
    one_file.close()

    3、写入文件 w

    在写入文件的时候, 如果指定的文件名不存在, 那么会自动创建

    在写入文件的时候, 如果指定的文件名存在, 那么会先清空原文件, 然后再写入

    # 1. 打开文件
    # 在写入文件的时候, 如果指定的文件名不存在, 那么会自动创建
    # 在写入文件的时候, 如果指定的文件名存在, 那么会先清空原文件, 然后再写入
    one_file = open("test2.txt", mode="w", encoding="utf-8")
    
    # 2. 写操作
    one_file.write("生如花开")
    one_file.write("阿登")
    one_file.write("雪地里的蜗牛")
    
    # 3. 关闭文件
    one_file.close()

    4、追加写入 a

    在追加文件的时候,,如果指定的文件名存在, 那么会在文件的尾部添加新的内容
    在追加文件的时候,如果指定的文件名不存在, 那么会先创建文件, 然后再写入

    # 1. 打开文件
    # 在追加文件的时候, 如果指定的文件名存在, 那么会在文件的尾部添加新的内容
    # 在追加文件的时候, 如果指定的文件名不存在, 那么会先创建文件, 然后再写入
    one_file = open("test3.txt", mode="a", encoding="utf-8")
    
    # 2. 读写操作
    # 文件原本第一次写入
    # one_file.write("生如花开")
    # one_file.write("阿登")
    # one_file.write("雪地里的蜗牛")
    # 再次写入,以追加的形式 a
    one_file.write("100 200 300
    ")
    
    # 3. 关闭文件
    one_file.close()

    5、每次只读取一行内容 readline、readlines

    read(读取小文件用这个)、readline(读取大文件用这个)、readlines

    • 使用read()方法, 会将文件中的所有内容读取出来, 以字符串类型呈现
    • 使用readline()方法, 每调用一次, 会读取一行的内容,以字符串类型呈现, 读到文件尾部之后, 会读取空格
    • 使用readlines()方法, 会把每一行数据读取出来, 放在一个列表中
    # 1. 打开文件
    one_file = open("test1.txt", encoding="utf-8")
    
    # 2. 读写操作
    # 使用readline方法, 每调用一次, 会读取一行的内容, 读到文件尾部之后, 会读取空格
    # content = one_file.readline()  # 读取第一行内容
    # content1 = one_file.readline()  # 读取第二行内容
    # print(content)
    # print(content1)
    
    # readlines方法, 会把每一行数据读取出来, 放在一个列表中
    content3 = one_file.readlines()
    print(content3)     # 读取全部内容,放到一个列表中
    print(content3[2])  # 以索引的方式,读取列表中 指定数据
    
    # 3. 关闭文件
    one_file.close()

    6、读取图片(二进制文件):读取图片并写入到新的文件

    # 1. 打开文件
    # open("图片所在路径", mode="rb")
    one_file = open("keyou_2.png", mode="rb")  # r:读  b:二进制文件
    two_file = open("keyou.png", mode="wb")  # w:写 b:二进制文件
    
    # 2. 读写操作
    content = one_file.read()  # 读取图片二进制数据
    two_file.write(content)  # 将读取的二进制数据, 写入到第二个文件中
    
    # 3. 关闭文件
    one_file.close()
    two_file.close()

    四、练习题:

    1. __name__变量有什么特性?

    • 运行当前模块,值为 __main__
    • 作为模块导出,值为 模块名

    2.os模块中有哪些常用的方法?用什么作用?

    详细看上面最上面

    • os.getcwd() :# getcwd()方法显示当前的工作路径,只具体到路径,不具体到文件。
    • os.path.join(a,b) :# 连接两个部分的路径,组成一个完整的路径
    • os.mkdir(路径名字) :# 在某个目录下创建一个新目录
    • os.rmdir(路径名字) :# 删掉一个目录
    • os.listdir() :# 获取当前路径下的目录列表
    • os.path.isdir :# 判断当前文件是否是目录,返回布尔值
    • os.path.isfile :# 判断当前文件是否是文件,返回布尔值

    3.文件有哪些种类?

    • 文本文件
    • 二进制文件

    4.文件的操作步骤

    • 打开文件
    • 读写文件
    • 关闭文件

    5.操作文件的常用函数/方法有哪些?

    • open:负责打开文件,并且返回文件对象
    • read:将文件内容读取到内存
    • write:将指定内容写入文件
    • close: 关闭文件

    6.read、readline、readlines有什么区别?

    • 使用read()方法,会将文件中的所有内容读取出来, 以字符串类型呈现
    • 使用readline()方法,每调用一次, 会读取一行的内容,以字符串类型呈现,读到文件尾部之后,会读取空格
    • 使用readlines()方法,会把每一行数据读取出来,放在一个列表中

    7. 打开文件的方式有哪些?

    默认以 只读方式 打开文件,并且返回文件对象

    语法:f = open("文件名",("访问方式"))

    • r 以只读模式打开文件,并将文件指针指向文件头;如果文件不存在会报错
    • w 以只写模式打开文76件,并将文件指针指向文件头;如果文件存在则将其内容清空,如果文件不存在则创建
    • a 以只追加可写模式打开文件,并将文件指针指向文件尾部;如果文件不存在则创建
    • r+ 在r的基础上增加了可写功能
    • w+ 在w的基础上增加了可读功能
    • a+ 在a的基础上增加了可读功能
    • b 读写二进制文件(默认是t,表示文本),需要与上面几种模式搭配使用,如ab,wb, ab, ab+(POSIX系统,包括Linux都会忽略该字符

    8.编写如下程序,将你喜欢的一首歌(音乐文件拓展名为mp3,比如刘德华忘情水.mp3),通过文件读写的方法将其复制并修改文件名

    # 方式一:
    # 1. 打开文件
    src_file = open("keyou_2.png", mode="rb")  # r:读  b:二进制文件
    des_file = open("keyou.png", mode="wb")  # w:写 b:二进制文件
    
    # 2. 读写操作
    content = src_file.read()  # 读取图片二进制数据
    des_file.write(content)  # 将读取的二进制数据, 写入到第二个文件中
    
    # 3. 关闭文件
    src_file.close()
    des_file.close()
    
    # 方式二
    # 1. 打开文件
    src_file = open("keyou_2.png", mode="rb")  # r:读  b:二进制文件
    des_file = open("keyou.png", mode="wb")  # w:写 b:二进制文件
    
    # 2. 读写操作
    while True:
        part_content = src_file.read(1024)  # 当读取到末尾结束
        if not part_content:
            break
        des_file.write(part_content)
    
    # 3. 关闭文件
    src_file.close()
    des_file.close()
    
    # 方式三
    # 1. 打开文件
    with open("mp3", "rd") as src_file, open("mp3", "wd") as des_file:
        # 处理文件
        while True:
            part_content = src_file.read(1024)  # 当读取到末尾结束
            if not part_content:
                break
            des_file.write(part_content)
    
    # 2. 关闭文件
    src_file.close()
    des_file.close()

    9.编写如下程序,有两行数据,存放在txt文件里面:

    • url:http://test.lemonban.com/futureloan/mvc/api/member/register@mobile:18866668888@pwd:123456
    • url:http://test.lemonban.com/futureloan/mvc/api/member/recharge@mobile:18866668888@amount:1000
    • 请利用所学知识,读取txt文件里面的两行内容,然后转化为如下格式(嵌套字典的列表):(可定义函数)
    • [{'url':'http://test.lemonban.com/futureloan/mvc/api/member/register','mobile':'18866668888','pwd':'123456'},{'url':'http://test.lemonban.com/futureloan/mvc/api/member/recharge','mobile':'18866668888','amount':'1000'}]
    def handle_data(one_list):
        """
        将字符串切割之后,转换为字典
        :param one_list:[str]
        :return:字典
        """
        full_result_list = []  # 用于存储最终结果
        tmp_result_list = []  # 用于存储临时结果
        for item in one_list:
            # 第一次以@来分隔
            # ['url:http://test.lemonban.com/futureloan/mvc/api/member/register','mobile:18866668888', 'pwd:123456']
            tmp_list = item.split("@")
            for val in tmp_list:
                # 第二次以:来分隔,只分隔一次
                # [['url','http://test.lemonban.com/futureloan/mvc/api/member/register'],
                # ['mobile', '18866668888'], ['pwd', '123456']]
                tmp_result_list.append(val.split(":", 1))
            full_result_list.append(dict(tmp_result_list))
            # 将嵌套列表的列表转化为字典,然后添加到full_result_list中
        return full_result_list
    
    
    def read_file_lines(file_path, mode='r', encoding='utf-8'):
        """
        读取文件
        :param file_path: 文件路径
        :param mode: 文件打开模式
        :param encoding: 文件编码
        :return: [str]
        """
        # 打开文件
        one_file = open(file_path, mode=mode, encoding=encoding)
        # 读取文件
        file_lines_list = one_file.readlines()
        for key, value in enumerate(file_lines_list):  # 将列表中每一行末尾的
    去除
            file_lines_list[key] = value[:-1]
        # 关闭文件
        one_file.close()
        return file_lines_list
    
    
    def main():
        """
        启动函数
        :return:
        """
        completed_data = handle_data(read_file_lines("urlshujv.txt"))
        print("最终处理的数据为:
    {}".format(completed_data))
    
    
    if __name__ == '__main__':
        main()

    11.编写如下程序

    创建一个txt文本文件,以csv格式(数据之间以英文逗号分隔)来添加数据

    • a.第一行添加如下内容:
    • name,age,gender,hobby,motto
    • b.从第二行开始,每行添加具体信息,例如:
    • 可优,17,男,臭美,Always Be Coding!
    • 柠檬小姐姐,16,女,可优,Lemon is best!
    • c.具体用户信息要求来自于一个嵌套字典的列表(请自定义这个列表),例如:
    person_info = [{"name": "可优",
                    "age": 17,
                    "gender": "",
                    "hobby": "臭美",
                    "motto": "Always Be Coding!"},
                   {"name": "柠檬小姐姐",
                    "age": 16,
                    "gender": "",
                    "hobby": "可优",
                    "motto": "Lemon is best!"},
                   ]
    • d.将所有用户信息写入到txt文件中之后,然后再读出
    • e.有精力的同学可以试试,多种方法来读取文件,比如csv模块(不作要求)
    • 注意:csv格式的数据,是以英文逗号分隔的
    # 构造数据
    person_info = [{"name": "可优",
                    "age": 17,
                    "gender": "",
                    "hobby": "臭美",
                    "motto": "Always Be Coding!"},
                   {"name": "柠檬小姐姐",
                    "age": 16,
                    "gender": "",
                    "hobby": "可优",
                    "motto": "Lemon is best!"},
                   ]
    
    
    def handle_data(one_list):
        """ 处理数据
        :param one_list: 嵌套字典的列表
        :return:字符串
        """
        datas_str = ""
        for item in one_list:  # 将字典的所有值转化为列表之后,使用逗号拼接
            tmp_list = []
            for i in item.values():
                tmp_list.append(str(i))
            datas_str = datas_str + ','.join(tmp_list) + "
    "
            return datas_str
    
    
    def write_file(file_path, data, mode='a', encoding='utf-8'):
        """ 写数据到文件 
        :param file_path: 文件路径 
        :param data: 添加的数据 
        :param mode: 文件打开模式 
        :param encoding: 文件编码 
        :return: """
        # 打开文件
        one_file = open(file_path, mode=mode, encoding=encoding)
        # 添加内容到文件
        one_file.write(data)
        # 关闭文件
        one_file.close()
    
    
    def main():
        # 文件路径
        file_path = 'result_datas.txt'
        first_line = 'name,age,gender,hobby,motto
    '
        # 写入第一行内容
        write_file(file_path, first_line)
        # 写入其他数据
        write_datas = handle_data(person_info)  # 将嵌套字典的列表数据转化为字 符串
        write_file(file_path, write_datas)
        # 读取数据
        with open(file_path, encoding="utf-8") as one_file:
            contents = one_file.read()
            print("最终文件内容为:
    {}".format(contents))
    
    
    if __name__ == '__main__': 
        main()

    方法二:

    import csv
    
    # 构造数据
    person_info = [{"name": "可优",
                    "age": 17,
                    "gender": "",
                    "hobby": "臭美",
                    "motto": "Always Be Coding!"},
                   {"name": "柠檬小姐姐",
                    "age": 16,
                    "gender": "",
                    "hobby": "可优",
                    "motto": "Lemon is best!"},
                   ]
    
    
    def write_from_dict(file_path, fieldnames, datas):
        """ 将来自于字典的数据写入csv文件中
        :param file_path: 文件路径
        :param fieldnames: 列名所在列表
        :param datas:嵌套字典的列表
        :return: """
        with open(file_path, mode='w', encoding='utf-8', newline='') as csv_file:
            writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
            # 将列名写在首行
            writer.writeheader()
            # 将数据写在其他行
            # for item in datas:
            # writer.writerow(item)
            writer.writerows(datas)
    
    
    def read_from_csv(file_path):
        """ 将csv文件中的数据读出
        :param file_path: csv文件路径
        :return: """
        with open(file_path, mode='r', encoding='utf-8') as csv_file:
            # reader = csv.DictReader(csv_file) 
            reader = csv.reader(csv_file)
            for row in reader:
                if row: print("{},{},{},{},{}".format(*row))
    
    
    def main():
        """ 
        程序入口函数 :
        return: 
        """
        # 文件路径 
        file_path = 'result_datas1.txt'
        field_names = ['name', 'age', 'gender', 'hobby', 'motto']
        write_from_dict(file_path, field_names, person_info)
        read_from_csv(file_path)
    
    
    if __name__ == '__main__':
        main()

    *******请大家尊重原创,如要转载,请注明出处:转载自:https://www.cnblogs.com/shouhu/,谢谢!!******* 

  • 相关阅读:
    引用的难点:函数返回值是引用(引用当左值)
    引用的意义与本质
    引用做函数参数
    Uva
    Uva
    Uva
    暑假集训-8.06总结
    暑假集训-8.05总结
    CH1801( 括号画家)
    最大异或对
  • 原文地址:https://www.cnblogs.com/shouhu/p/12665413.html
Copyright © 2011-2022 走看看