Python(28)-文件,os模块
文件
- 1. 文件
- 2. 文件的基本操作
- 3. 讀取文件open()
- 3.1 文件指針: 標記從哪一個位置開始讀取數據.
- 3.2 文件的打開方式mode
- 3.3 文件按行讀取
- 3.3.1 readline()
- 3.3.2 readlines()
- 4.文件輸出f.write(),print()
- 5.文件復制
- 5.1 小文件復制(搬家)
- 5.2 大文件復制(搬家)
- 5.3 shutil.copy()
- 5.4 shutil.rmtree()
- 6.os 模塊
- 6.1 改變工作目錄os.chdir()
- 6.2 文件重命名os.rename()
- 6.3 刪除文件os.remove()
- 6.4 刪除空路徑os.removedirs()
- 6.5 目錄列表os.listdir()
- 6.6 創建目錄os.mkdir()
- 6.7 刪除目錄os.rmdir()
- 6.8 判斷某個目錄是否存在,如果不在,創建這個目錄
- 6.9 os.path.split("xxx/xx/xxxx")
- 6.10 os.path.isdir()
- 7.CSV文件
- 8.JSON文件
- 9.文本文件的編碼方式
- 10.在Python2.x中使用中文
- 11.eval()
本系列博文來自學習《Python基礎視頻教程》筆記整理,視屏教程連接地址:http://yun.itheima.com/course/273.html
open 不僅能打開txt文件,還能打開.csv,.JSON 文件。🐂🍺呀。
1. 文件
計算機的文件就是保存在 長期存儲設備 上的一段數據,長期存儲設備包括:硬盤 U盤 移動硬盤 光盤.
文件的作用:將數據長期保存下來,在需要的時候使用.
cpu 要使用 存在硬盤中文件,需要先將文件加載到內存.
常見兩種類型的文件 : 文本文件 和 二進制文件
文本文件 : 可以只用文本編輯軟件查看的 ,如Python源程序 , 本質上還是二進制文件
二進制文件 : 保存的內容不是給人直接看的,而是提供給其他軟件使用的.例如: 圖片文件 音頻文件 視屏文件,等不能直接用文本編輯器查看,要有相應的應用軟件.
2. 文件的基本操作
在計算機中操作文件的固定套路:
1.打開文件
2.讀寫文件:讀-將文件內容加載到內存.寫-將內存內容寫到文件
3.關閉文件
在Python中 常用的操作文件的1個函數,3個方法.
| f.open() | 函數 | 打開文件,并返回文件操作對象(文件句柄) |
| f.read() | 方法 | 將文件內容讀到內存 |
| f.write() | 方法 | 將內存內容寫入文件 |
| f.close() | 方法 | 關閉文件,不關閉會占用系統可打開文件句柄數 |
open函數打開文件,并返回文件操作對象,后面的三個方法通過 文件對象 來調用.
文件句柄的其他方法
| f.flush() | 刷新輸出緩存 |
| f.read([count]) | 指定讀出count個字節的文件內容 |
| f.readline() | 讀出一行信息 |
| f.readlines() | 讀出所有行信息 |
| f.seek(offset[,where]) | 從where開始移動文件指針offset個單位,where=0文件開始處,1當前位置,2文件結尾 |
| f.tell() | 獲得文件指針的位置 |
| f.writelines(list) | 把list中的字符串一行一行寫入文件,連續寫入文件,沒有換行 |
3. 讀取文件open()
open函數 的第一個參數是 要打開的文件名(要帶擴展名). 如果文件存在,返回文件操作對象,如果文件不存在,會拋出異常.
read方法可以一次性 讀入并返回文件的所有內容
如果忘記關閉文件,會造成資源浪費,和后續操作困難所以打開之后,應該寫關閉語句,然后再去寫讀寫操作語句
3.1 文件指針: 標記從哪一個位置開始讀取數據.
第一次打開文件時,文件直至會指向 文件的開始位置.
執行read方法后,文件指針會指向 讀取內容的末尾
注意:如果執行了一次read方法,讀取了所有內容,再次調用 read方法時,不能夠讀取文件內容了. 因為第一次讀取后,文件指針移動到了文件末尾.
# 1.打開文件 file=open("test.txt")# 2.讀取文件內容 text=file.read() print(text) print(len(text))print("-"*50) text=file.read() print(text) print(len(text))# 3.關閉文件,如果忘記關閉文件,會造成資源浪費,和后續操作困難所以打開之后,應該寫關閉語句,然后再去寫讀寫操作語句 file.close()輸出:
hello python hallo19 --------------------------------------------------0實際上并沒有說如何解決這個問題,或者進一步操作
3.2 文件的打開方式mode
file=open(“文件名.擴展名”,“打開方式”)
打開文件的方式:open 函數需要傳遞的第二個參數.如果不指定打開方式,默認以只讀方式 打開,并返回文件對象
| r | 以只讀方式打開,文件指針在文件頭 |
| w | 以只寫方式打開,如果文件存在會覆蓋, 如果文件不存在創建新的文件 |
| a(append) | 以追加方式打開,文件指針在文件尾. 如果文件不存在創建新的文件 |
| r+ | 以讀寫方式打開,文件指針在文件頭 |
| w+ | 以讀寫方式打開,如果文件存在會覆蓋, 如果文件不存在創建新的文件 |
| a+ | 以讀寫方式打開,文件指針在文件尾. 如果文件不存在創建新的文件 |
讀寫方式打開,頻繁操作文件指針,會影響文件讀寫效率.開發時,更多會以只讀 或者只寫 的方式來操作文件.
3.3 文件按行讀取
3.3.1 readline()
read 方法會把文件的所有內容都讀入到內存,如果文件太大,會使得內存占用率非常高.可以改用逐行讀取的方法.readline()方法可以一次讀取一行內容,方法執行后會把文件指針移動到下一行.
代碼示例:
3.3.2 readlines()
data = [] data1 = [] fr = open("readline_test.txt") for line in fr.readlines():line = line.strip() # 去掉字符串開頭或者結尾的空白符,包括換行符data_line = line.split(",") # 使用","分割數據并返回一個列表data_line1 = list(map(int, line.split(",")))data.append(data_line)data1.append(data_line1)print(data) print(data1) fr.close()4.文件輸出f.write(),print()
f = open("outpu.txt", "w") # 沒有文件的話會新建一個 data = [['1', '2'], ['3', '4']] line1 = ','.join(data[0]) f.write(line1 + '\n') line2 = ','.join(data[1]) f.write(line2 + '\n')# print 把原本輸出到shell 的內容改輸到文件中 data = [[1, 2], [3, 4]] for line in data:print(str(line[0]) + ',' + str(line[1]), file=f)output.txt文件的內容
1,2 3,4 1,2 3,45.文件復制
5.1 小文件復制(搬家)
打開兩個文件-讀取原文件內容-寫入目標文件-關閉兩個文件。
打開文件:原文件默認以只讀的方式打開,目標文件以只寫"w"的方式打開,如果沒有目標文件,會新建一個目標文件。
代碼實例:
# 1.打開文件 file_read=open("readme.txt") file_write=open("readme_copy.txt","w") # 2.讀取操作 text=file_read.read() file_write.write(text) # 3.關閉 file_read.close() file_write.close()5.2 大文件復制(搬家)
一次性讀取會給內存造成巨大的壓力,可以使用按行讀取與寫入來實現這個功能。
# 1.打開文件 file_read=open("readme.txt") file_write=open("readme_copy.txt","a")# 2.讀取操作,按行操作 while True:text=file_read.readline()if not text:breakfile_write.write(text) # 從頭開始寫是文件指針的問題,設定在本頁的結尾打開,如一追加的方式加原文件的內容到新文件。# 3.關閉 file_read.close() file_write.close()5.3 shutil.copy()
import shutil
shutil.copy(文件1,文件2)
對文件1的內容和權限都進行copy。
5.4 shutil.rmtree()
刪除一個文件夾(如果文件夾里面有文件也會一起被刪掉)比較6.3中的刪除。
shutil.rmtree(’./cyy_test/subtest2’)
6.os 模塊
文件/目錄的常用管理操作
在終端或者文件瀏覽器中可以執行的常規操作。例如:創建,重命名,刪除,改變路徑,查看目錄內容等。通過Python實現上述功能,需要導入os模塊。
6.1 改變工作目錄os.chdir()
使用腳本運行,默認的工作目錄為腳本所在的目錄中??梢允褂胏hdir 改變工作目錄
import os print(os.getcwd()) # linux 命令行使用pwd來輸出當前路徑 os.chdir("/Users/chenyingying") print(os.getcwd())輸出
/Users/chenyingying/PycharmProjects/DataMining_python /Users/chenyingying6.2 文件重命名os.rename()
os.rename(源文件名.擴展名,目標文件名.擴展名)
6.3 刪除文件os.remove()
os.remove(文件名.擴展名)
demo:刪除文件而保留目錄結構
import os g=os.walk('/home/abc/Desktop/cyy_test') for path,dir,files in g: #路徑path 文件夾中的文件名files和文件夾名dir(都是list)print(path,dir,files)while files!=[]:for file in files:print(file)os.remove(os.path.join(path,file))files.remove(file) print('end')由頂至下的遍歷所有文件夾
6.4 刪除空路徑os.removedirs()
刪除一個空文件夾,如果文件夾里有文件,或者文件夾是刪除不成功的。
os.removedirs(’./cyy_test/subtest123’)
刪除一個非空路徑(如果文件夾里面有文件也會一起被刪掉)
shutil.rmtree(’./cyy_test/subtest2’)
6.5 目錄列表os.listdir()
os.listdir(目錄名)
os.listdir(".") # 查看當前目錄的目錄列表
6.6 創建目錄os.mkdir()
os.mkdir(“目錄名”)
6.7 刪除目錄os.rmdir()
os.rmdir(”目錄名“)
6.8 判斷某個目錄是否存在,如果不在,創建這個目錄
import os log_path = os.getcwd() + '/Logs/' #當前文件夾下的Logs文件夾if not os.path.exists(log_path) : #判斷文件夾或文件os.makedirs(log_path) #創建參考資料:https://blog.csdn.net/xielifu/article/details/81013536
6.9 os.path.split(“xxx/xx/xxxx”)
將路徑分割出來,一次分割一個級別,每次分割得到兩個元素的tuple.
>>> import os >>> a=os.getcwd() >>> a '/home/pp/Desktop/testsplit/aaa/bbb'>>> a=os.getcwd()+"/1.txt" >>> a '/home/pp/Desktop/testsplit/aaa/bbb/1.txt'>>> b=os.path.split(a) >>> b ('/home/pp/Desktop/testsplit/aaa/bbb', '1.txt')>>> c=os.path.split(b[0]) >>> c ('/home/pp/Desktop/testsplit/aaa', 'bbb')6.10 os.path.isdir()
目錄名:要查看的目錄的名字。確定目錄列表中的字符串為一個目錄,而不是一個文件。返回的True或者False。
os.path.isdir(“xxx”)
先判斷路徑是否存在,不存在就創建該路徑
if not os.path.isdir(tarDir): os.makedirs(tarDir)7.CSV文件
excel 格式的數據,將文件存成csv。以逗號作為文件分割符號。
f=open(‘data.csv’)
import pandas
data = pandas.read_csv()
8.JSON文件
保存字典格式的數據,將文件存成JSON 的格式。借助json模塊實現序列化和反序列化
序列化:字典格式-》字符串 json.jumps()
反序列化:字符串-》字典格式 json.loads()
不帶s的 json.jump()保存json文件,json.load()導入json文件
輸出
原x {'height': 176, 'weight': 60} 序列化x {"height": 176, "weight": 60} # 三者的區別并不大 反序列化x {'height': 176, 'weight': 60} 從文件讀取到的json {'height': 176, 'weight': 60}9.文本文件的編碼方式
文本文件存儲的內容是基于字符編碼的文件,常見的編碼有ASCII和UNICODE編碼。
Python2.x默認使用ASCII 編碼
Python3.x 默認使用UTF-8編碼
Ascii編碼:計算機中只有25個ASCII 字符,一個ASCII在內存中占一個字節(8位,256種組合方式)
UTF-8編碼:使用1-6個字節來表示一個字符,涵蓋了地球上幾乎所有地區的文字。大多數漢字會使用三個字節表示。UTF-8 是UNICODE編碼的一種編碼格式。
10.在Python2.x中使用中文
希望Python2.x 解釋器以UTF-8的方式解析文件,需要在Python2.x的開頭使用一下代碼,解釋器會以UTF-8編碼來處理Python文件.
官方推薦:
也可以寫:
# coding:utf8在Python2.x中,帶有中文與英文混合的字符串需要在字符串的開頭寫一個u,來告訴編譯器這是一個utf8編碼的字符串.
a=u"hello 世界"11.eval()
eval 函數會將字符串當成 有效表達式 來 求值 , 并返回計算結果.
簡單案例:計算器.要求用戶輸入一個 加減乘除混合運算,程序返回一個計算結果
input_str=input("請輸入算術題") print(eval(input_str))# 輸入:(1+3)*5 # 輸出:15 完全不需要解析表達式中的內容,自動轉換計算.注意事項:
在開發時,千萬不要使用eval()直接轉換**input()**的結果
在控制臺上輸入以下命令,會直接執行任何的終端命令
import(“os”).system(“ls”)
import os print(os.path.exists("cyy_test*")) # 不能使用通配符 print(os.path.exists("cyy_test1.py"))總結
以上是生活随笔為你收集整理的Python(28)-文件,os模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习问题总结(02)
- 下一篇: 《Python Cookbook 3rd