文件
- 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方法可以一次性 讀入并返回文件的所有內容
如果忘記關閉文件,會造成資源浪費,和后續操作困難所以打開之后,應該寫關閉語句,然后再去寫讀寫操作語句
# 1.打開文件
file=open("test.txt")# 2.讀取文件內容
text=file.read()
print(text)# 3.關閉文件,如果忘記關閉文件,會造成資源浪費,和后續操作困難所以打開之后,應該寫關閉語句,然后再去寫讀寫操作語句
file.close()
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()方法可以一次讀取一行內容,方法執行后會把文件指針移動到下一行.
代碼示例:
file=open("test.txt")
while True:text=file.readline()print(text)# 判斷是否讀到內容if not text:breakfile.close()
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()
read(size)當size不指定時,會將文件全部內容讀取
readline()一次只讀取一行即遇到‘\n’返回
readlines()讀取整個文件,并返回列表,一行為一個元素
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,4
5.文件復制
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()
使用腳本運行,默認的工作目錄為腳本所在的目錄中。可以使用chdir 改變工作目錄
import os
print(os.getcwd())
# linux 命令行使用pwd來輸出當前路徑
os.chdir("/Users/chenyingying")
print(os.getcwd())
輸出
/Users/chenyingying/PycharmProjects/DataMining_python
/Users/chenyingying
6.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文件
import json
x = {"height": 176,"weight": 60}
print("原x", x)
y = json.dumps(x) # 轉化為字符串
print("序列化x", y)
x = json.loads(y)
print("反序列化x", x)f = open("json_test.json", 'w')
json.dump(x, f)
f.close()f = open("json_test.json", 'r')
print("從文件讀取到的json", json.load(f))
輸出
原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=utf-8 *-*
也可以寫:
# 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"))