Python中的文件操作
文件的打開與關(guān)閉
一般操作文件的流程都很簡(jiǎn)單:
- 打開/新建 一個(gè)文件
- 讀/寫 文件
- 關(guān)閉文件
打開文件
使用open()
函數(shù)來打開/新建一個(gè)文件
示例:file = open('test.py','w')
file表示open()
的返回值,即已經(jīng)訪問到的文件
第二個(gè)選項(xiàng),'w'表示只能寫烈钞,'r'表示只能讀旺拉,'a'表示追加等等产上,具體見:
訪問模式 | 含義 |
---|---|
r | 只讀方式打開文件 |
w | 只寫方式打開文件 |
a | 追加方式打開/新建一個(gè)文件 如果已有內(nèi)容,新內(nèi)容追加在文件內(nèi)容末尾 |
rb | 默認(rèn)模式蛾狗,以二進(jìn)制的格式只讀的打開一個(gè)文件 文件指針在文件開頭 |
wb | 二進(jìn)制只寫訪問文件 如果之前有內(nèi)容則覆蓋 文件不存在則先創(chuàng)建 |
ab | 同理晋涣,二進(jìn)制追加 |
r+ | 打開一個(gè)文件用于讀寫,文件指針放在文件開頭 |
w+ | 打開一個(gè)文件用于讀寫沉桌,文件存在則覆蓋谢鹊,不存在則先創(chuàng)建 |
a+ | 打開一個(gè)文件用于讀寫 文件內(nèi)容存在則新內(nèi)容追加到末尾 文件指針在文件末尾 |
rb+ | 二進(jìn)制打開文件用于讀寫 文件指針在開頭 |
wb+ | 二進(jìn)制打開文件用于讀寫 有覆蓋 沒有先新建 |
ab+ | 二進(jìn)制打開文件用于讀寫 指針在末尾 有則追加 沒有先新建 |
關(guān)閉文件 file.close()
f = open('test.py','w+') # 打開文件 f為open()返回值即打開的文件
f.close() # 關(guān)閉文件
文件的讀寫 read() write()
f = open('test.js','r')
con = f.read() # read()方法表示一次性把目標(biāo)文件全部讀完
print(con) # console.log('test.js')
f.close()
# 如果給read()傳遞了參數(shù), 那么read(n)可以讀到指定n長(zhǎng)度的內(nèi)容
# 可以一直調(diào)用read(n)直到讀完目標(biāo)文件 之后read()返回空字符串
使用read()
一次性讀完文件的內(nèi)容之后留凭,再次調(diào)用read()
返回的是空字符串佃扼。
f = open('test.js','r')
while True:
content = f.read(1) # read(n)即一次讀取n字節(jié)長(zhǎng)度的內(nèi)容
print(content)
if len(content) == 0: # 等到讀取完后 read()返回的空字符串,可以跳出循環(huán)
break
f = open('test.js','a+')
length = f.write('\nconsole.log("hello world")')
print(length) # 27
# write()函數(shù)返回的是寫入的字符長(zhǎng)度
f.close()
g = open('test.js','r')
print(g.read()) # 輸出為:
# console.log('test.js')
# console.log("hello world")
g.close()
可以利用read()
和write()
來進(jìn)行文件的復(fù)制:
f = open('test.js','r')
content = f.read()
f.close()
g = open('test_backup.js','w')
g.write(content)
g.close()
其實(shí)還有其他讀文件的方法:
-
readlines()
:
f = open('test.js','r')
content = f.readlines()
print(content) # ["console.log('test.js')\n", 'console.log("hello world")']
readline()
f = open('test.js','r')
line1 = f.readline()
line2 = f.readline()
line3 = f.readline()
print(line1) # console.log('test.js')\n
print(line2) # console.log("hello world")
print(line3) # '' 空字符串
readline()
是按照行來一行一行讀取蔼夜,而readlines()
是連續(xù)調(diào)用readline()
然后將結(jié)果組成一個(gè)list返回兼耀。
對(duì)于大文件的讀寫
對(duì)于大文件,肯定不能使用read()
一下子都讀到內(nèi)存里求冷。
我們可以使用合適的字節(jié)數(shù)瘤运,每次讀取一點(diǎn)點(diǎn),示例:
f = open('test.js','r')
while True:
content = f.read(1024) # 假如一次讀取1024字節(jié)
print(content)
if len(content) == 0:
break
文件的定位
- 獲取當(dāng)前的位置
tell()
在讀寫文件的過程中匠题,可以使用tell()
來獲取當(dāng)前的位置
f = open('test.js','r')
f.read(5)
position = f.tell()
print(position) # 5
f.read(5)
position2 = f.tell()
print(position2) # 10
- 定位到文件的某個(gè)位置
seek(offset,from)
如果在讀寫文件的過程中拯坟,需要從另外一個(gè)位置進(jìn)行操作的話,可以使用seek()
seek(offset,from)
:
- offset:偏移量
- from:方向(0表示文件開頭韭山,1表示當(dāng)前位置郁季,2表示文件末尾)
# 假設(shè)我們現(xiàn)在從test.js的第二行開始讀,即離文件開頭23字節(jié)的地方開始讀
f = open('test.js')
f.seek(23,0) # 23表示offset,0表示從文件開頭開始
print(f.read()) # console.log("hello world")
關(guān)于seek()
,我們?cè)?code>read()方法讀完文件后,如果還想在讀一遍钱磅,可以使用seek(0,0)
將文件指針重新設(shè)為開頭梦裂,再調(diào)用read()
就又可以讀取一遍。
文件的其他相關(guān)操作
還有一些文件的常規(guī)操作介紹一下:
- 文件重命名
os
模塊的rename(old_file_name,new_file_name)
import os
os.rename('test_backup.js','test_rename.js')
- 刪除文件
os
模塊的remove(file_name)
import os
os.remove('test_rename.js')
- 創(chuàng)建文件夾
os.mkdir(dir_name)
- 獲取當(dāng)前目錄
os.getcwd()
import os
print(os.getcwd()) # /home/deejay/learn-python
- 改變默認(rèn)目錄
os.chdir()
import os
print(os.getcwd()) # /home/deejay/learn-python
os.chdir('/usr/bin')
print(os.getcwd()) # /usr/bin
- 獲取目錄列表
os.listdir('./')
改方法返回的是一個(gè)list,每個(gè)元素都是ls
命令下的一個(gè)文件 - 刪除文件夾
os.rmdir(dir_name)