一、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/,謝謝!!*******