7 - Python OS 模塊處理路徑及文件處理


一、os模塊目錄處理

需要導入: import os

import os
# os 模塊提供了非常豐富的方法用來處理文件和目錄
1.用於返回當前工作目錄
dir_name1 = os.getcwd()  # 打印:H:\Pycharm_Projects\lemon_20\homework
print('dir_name1:', dir_name1)

2.獲取操作系統名稱
print(os.name)  # 若是Windows系統會打印nt,若是linux/Unix會打印posix

3.在某個路徑下創建一個新目錄
# 相對路徑, 相對當前py文件
os.mkdir("test1")
# 使用絕對路徑來創建文件
os.mkdir(r"H:\Pycharm_Projects\lemon_20\homework\\test2")

4.刪除目錄
os.rmdir("test1")

5.刪除文件
os.remove('song1_new.mp3')

6.獲取當前路徑下的目錄列表
print(os.listdir(r"H:\Pycharm_Projects\lemon_20\homework"))
# 第二種:
print(os.listdir("."))

7.打印當前模塊所在目錄的上級目錄的目錄列表
print(os.listdir(".."))

8.獲取某個文件所在的目錄路徑
dir_name2 = os.path.dirname(r"homework\test.py")
dir_name3 = os.path.dirname(r"test.py")
dir_name4 = os.path.dirname(r"sdafhjsdg\asdjgldfg\sdg431gsd\homework_0703.py")
dir_name5 = os.path.dirname(r"sdafhjsdg\asdjgldfg\sdg431gsd\test.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_Projects\lemon_20\homework\test.py', 'testcases'))

10.判斷某個路徑是否存在
result = os.path.exists(r"H:\Pycharm_Projects\lemon_20\homework\hua.py")
print(result)

11.判斷某個目錄是否存在
result = os.path.isdir(r"H:\Pycharm_Projects\lemon_20\homework\test")
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\n")

# 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):  # 將列表中每一行末尾的\n去除
        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("最終處理的數據為:\n{}".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) + "\n"
        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\n'
    # 寫入第一行內容
    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("最終文件內容為:\n{}".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/,謝謝!!******* 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM