龍崗營銷網(wǎng)站建設(shè)公司網(wǎng)站建設(shè)深圳公司
一、文件指針
python中嚴格來說沒有指針這個說法,但有指針這個用法的體現(xiàn)。指針概念常用于c語言、c++語言中
在Python的文件操作中,文件指針(也稱為文件游標或文件句柄的位置)是一個內(nèi)部標記,它指示了當(dāng)前文件操作的讀寫位置,文件指針在打開文件時初始化,并隨著文件的讀寫操作而移動
文件指針的行為:
1、打開文件:當(dāng)使用open()函數(shù)打開文件時,文件指針默認位于文件的開頭(對于文本文件是第一個字符之前,對于二進制文件是第一個字節(jié)之前)
2、讀取文件:當(dāng)執(zhí)行讀取操作(如read()、readline()或readlines())時,文件指針會向前移動到讀取內(nèi)容的末尾
3、寫入文件:在寫入操作(如write())中,文件指針會移動到寫入內(nèi)容的末尾,如果文件是以追加模式('a'或'a+')打開的,文件指針會首先移動到文件的末尾
4、文件指針的位置:可以使用 tell() 方法獲取當(dāng)前文件指針的位置(以字節(jié)為單位)
5、移動文件指針:使用?seek()?方法可以改變文件指針的位置。seek() 方法接受一個偏移量(可以是正數(shù)或負數(shù))和一個可選的基準位置(默認為文件的開頭,但也可以是文件的末尾或當(dāng)前位置)
eg:以下是一個簡單的示例,展示了如何使用文件指針來讀取和寫入文件
# 打開文件進行讀寫操作
with open('example.txt', 'w+') as file:# 寫入一些內(nèi)容到文件file.write('Hello, World!\n')# 獲取當(dāng)前文件指針的位置(應(yīng)該位于文件末尾)position = file.tell()print(f'Current file position: {position}') # 輸出應(yīng)該是文件的字節(jié)長度,例如14# 將文件指針移回文件的開頭file.seek(0)# 讀取文件內(nèi)容content = file.read()print('File content:')print(content) # 輸出: Hello, World!# 再次獲取文件指針的位置(現(xiàn)在應(yīng)該在文件末尾)position = file.tell()print(f'Current file position after reading: {position}') # 輸出應(yīng)該是文件的字節(jié)長度# 注意:當(dāng)使用with語句時,文件會在塊結(jié)束時自動關(guān)閉,無需調(diào)用close()方法。
輸出內(nèi)容:
Current file position: 15
File content:
Hello, World!
?注意事項:
1、在文本模式下,tell()方法返回的是字符的索引(對于UTF-8編碼,一個字符可能對應(yīng)一個或多個字節(jié)),在二進制模式下,它返回的是字節(jié)的索引
2、使用seek()方法時,如果文件是以文本模式打開的,偏移量應(yīng)該對應(yīng)于字符數(shù)(盡管底層實現(xiàn)可能使用字節(jié)),如果文件是以二進制模式打開的,偏移量應(yīng)該對應(yīng)于字節(jié)數(shù)
3、在某些情況下,特別是在涉及非ASCII字符和混合編碼時,文本模式下的seek()和tell()可能會表現(xiàn)得不如預(yù)期,在這些情況下,使用二進制模式可能更為可靠
二、文件定位操作
2.1? tell()&?seek()
tell():顯示文件內(nèi)當(dāng)前位置,即文件指針當(dāng)前位置
seek(offset,whence):移動文件讀取指針到指定位置
offset:偏移量,表示要移動的字節(jié)數(shù)
whence:起始位置,表示移動字節(jié)的參考位置,默認是0,0代表文件開頭作為參考位置,1代表當(dāng)前位置作為參考位置,2代表將文件結(jié)尾作為參考位置
seek(0,0)就會把文件指針移到文件開頭
eg:
我們在 py1文件夾中新建一個文件名為 example.txt,如下圖所示:
f = open('example.txt','w+') # 可讀可寫,如果存在文件,覆蓋已有文件內(nèi)容
f.write("hello Python!") # 寫入hello Python!
pos = f.tell() # 顯示文件內(nèi)當(dāng)前位置,即文件指針當(dāng)前位置
print('當(dāng)前文件指針所在的位置:',pos)
f.seek(0,0) # 把f文件指針移到開頭
print('移到后文件指針所在的位置:',f.tell())
print(f.read())
f.close()
輸出內(nèi)容:
當(dāng)前文件指針所在的位置: 13
移到后文件指針所在的位置: 0
hello Python!
2.2 with open
作用:代碼執(zhí)行完,系統(tǒng)會自動調(diào)用 f.close() ,可以省略文件關(guān)閉步驟
eg:
with open("example.txt","w") as f: # f是文件對象f.write("emmm")
# 檢驗一下with open是否真的自動關(guān)閉,用f.closed判斷print(f.closed) # 輸出:False,說明此時還未關(guān)閉
print(f.closed) # 輸出:True,說明此時已經(jīng)關(guān)閉
三、編碼格式
3.1 encoding編碼
注意:file 對象的 encoding 參數(shù)的默認值與平臺有關(guān),比如windows上默認字符編碼為GBK。
encoding 表示編碼集.根據(jù)文件的實際保存編碼進行獲取數(shù)據(jù),對于我們而言,使用更多的是utf-8
當(dāng)我們將中文寫入文件中時,如果沒有轉(zhuǎn)碼會發(fā)生亂碼的情況:
如下:
eg:
with open('example.txt','w') as f:f.write("君君18歲")
將產(chǎn)生亂碼:
采用encoding編碼可解決亂碼問題:
with open('example.txt','w',encoding='utf-8') as f:f.write("君君18歲")
example.txt 文件中亂碼情況得到解決:
?
當(dāng)讀取文件的時候也要注意轉(zhuǎn)碼,比如在example.txt 文件中有如下幾句話:
with open('example.txt',encoding='utf-8') as f:print(f.read())
輸出內(nèi)容:
君君18歲
哈哈哈哈哈
嘻嘻嘻嘻
不靈不靈
3.2 案例:圖片復(fù)制
先新建一個帶圖片的文件夾(本人在桌面上新建一個名為“圖片”的文件夾,里面有一張名為“圖片1” 的圖片)
1、讀取圖片
圖片是一個二進制文件,想要寫入必須要先拿到
2、寫入圖片
eg:
with open(r'C:\Users\31761\Desktop\圖片\圖片1.jpg',"rb") as file: # r取消轉(zhuǎn)義字符,rb讀取二進制文件img = file.read()print(img)
# 將讀取到的內(nèi)容寫入到當(dāng)前文件中
with open(r"D:\Python project\py1\圖片1.jpg",'wb') as f: # wb 寫入二進制文件f.write(img)
圖片已經(jīng)寫入相關(guān)路徑:?
?
四、目錄常用操作?
在Python中,處理文件和目錄的常用操作主要通過內(nèi)置的os模塊和pathlib模塊來完成。這兩個模塊提供了豐富的功能來創(chuàng)建、刪除、遍歷、修改目錄和文件。以下是一些常用的目錄操作示例:
導(dǎo)入模塊:import? os
1.文件重命名: os.rename (舊文件名,新文件名)
2.刪除文件: os.remove (日標文件名)
3.創(chuàng)建文件夾: os.mkdir (文件夾名)
4.獲取當(dāng)前目錄: os.getcwd ()
5.獲取目錄列表: os.listdir (目錄)
6.刪除文件夾: os.rmdir (文件夾名)
4.1 使用?os
?模塊
1、獲取當(dāng)前工作目錄
import os
current_directory = os.getcwd()
print(current_directory)
2、更改當(dāng)前工作目錄
os.chdir('/path/to/new/directory')
3、列出目錄內(nèi)容
contents = os.listdir('.') # '.' 表示當(dāng)前目錄
print(contents)
4、創(chuàng)建目錄
os.makedirs('/path/to/new/directory', exist_ok=True) # exist_ok=True 表示如果目錄已存在則不拋出異常
5、刪除目錄
os.rmdir('/path/to/directory') # 只能刪除空目錄
os.removedirs('/path/to/directory') # 刪除多級空目錄
shutil.rmtree('/path/to/directory') # 刪除目錄及其內(nèi)容,需要導(dǎo)入 shutil 模塊
6、檢查路徑是否存在
exists = os.path.exists('/path/to/directory')
print(exists)
7、檢查路徑是否是目錄
is_directory = os.path.isdir('/path/to/directory')
print(is_directory)
8、獲取目錄的絕對路徑
absolute_path = os.path.abspath('/path/to/directory')
print(absolute_path)
9、拼接路徑
new_path = os.path.join('/path', 'to', 'directory')
print(new_path)
4.2 使用?pathlib
?模塊
pathlib
?模塊提供了一個面向?qū)ο蟮穆窂讲僮鞣椒?#xff0c;使得路徑操作更加直觀和方便。
1、獲取當(dāng)前工作目錄
from pathlib import Path
current_directory = Path.cwd()
print(current_directory)
2、更改當(dāng)前工作目錄
# pathlib 沒有直接更改當(dāng)前工作目錄的方法,仍然需要使用 os.chdir
os.chdir('/path/to/new/directory')
3、列出目錄內(nèi)容
directory = Path('.')
contents = list(directory.iterdir())
for item in contents:print(item)
4、創(chuàng)建目錄
new_directory = Path('/path/to/new/directory')
new_directory.mkdir(parents=True, exist_ok=True) # parents=True 表示創(chuàng)建多級目錄
5、刪除目錄
directory.rmdir() # 只能刪除空目錄
# 刪除目錄及其內(nèi)容,需要遞歸刪除
for item in directory.rglob('*'):if item.is_dir():item.rmdir()else:item.unlink()
directory.rmdir()
6、檢查路徑是否存在
exists = Path('/path/to/directory').exists()
print(exists)
7、檢查路徑是否是目錄
is_directory = Path('/path/to/directory').is_dir()
print(is_directory)
8、獲取目錄的絕對路徑
absolute_path = Path('/path/to/directory').resolve()
print(absolute_path)
9、拼接路徑
new_path = Path('/path') / 'to' / 'directory'
print(new_path)
今天的分享就到這里了,希望能對大家有所幫助~