Python----文件的IO操作


 

一、文件操作

r 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
rb 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。
r+ 打開一個文件用於讀寫。文件指針將會放在文件的開頭。
rb+ 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。
w 打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
wb 以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
w+ 打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
wb+ 以二進制格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
a 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。
ab 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。
a+ 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。
ab+ 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。

  打開文件

  假設我們有一個file.txt文件,內容為:

abcdefg
jijklmn
opqtsr
uvwxyz
# Author:Tim Gu
data = open('file.txt',encoding="utf-8").read()
print(data)

輸出:

abcdefg
jijklmn
opqtsr
uvwxyz

  讀文件:

# Author:Tim Gu
f = open('file.txt','r',encoding='utf-8')
data = f.read()
print(data)
>>>
abcdefg
jijklmn
opqtsr
uvwxyz

  寫文件:

f = open('file.txt2','w',encoding='utf-8') #文件句柄,使用w時事實上是創建了一個新文件,如果源文件存在,會覆蓋
f.write("I will go home!") 
f.write('\nByeBye!')
f.write('\nadfas')

 

  追加文件:

  

f = open('file.txt2','a',encoding='utf-8') #文件句柄
f.write("See you,tomorrow!")

  打開文件file.txt2

I will go home!
ByeBye!
adfasSee you,tomorrow!

  以行讀取文件:
# Author:Tim Gu
f = open('file.txt2','r',encoding='utf-8') #文件句柄
print(f.readline())  #讀取一行
for i in range(2):   #使用for循環讀取2行
    print(f.readline()) 

  使用readline()讀取的是文件的單行,readlines()會讀取文件全部行,每行作為一個元素形成一個列表。readlines()因為會一下子把文件全部讀取到內存,所以只適合讀小文件。

  下面示例讀取文件,但不讀取第10行:

# Author:Tim Gu
f = open('file3.txt','r',encoding='utf-8') #文件句柄
#print(f.readlines())
for index,line in enumerate(f.readlines()): #使用遍歷讀取文件
    if index == 9:
        print('------------------我是分割線-------------------')
        continue
    print(line.strip())

  輸出:

從前現在過去了再不來
紅紅落葉長埋塵土內
開始終結總是沒變改
天邊的你飄泊白雲外
苦海翻起愛恨
在世間難逃避命運
相親竟不可接近
或我應該相信是緣份
情人別后永遠再不來(消散的情緣)
------------------我是分割線-------------------
鮮花雖會凋謝(只願)
但會再開(為你)
一生所愛隱約(守候)
在白雲外(期待)
苦海翻起愛恨
在世間難逃避命運
相親竟不可接近
或我應該相信是緣份
苦海翻起愛恨
在世間難逃避命運
相親竟不可接近
或我應該相信是緣份

 

  處理大文件的方法:這行代碼的效果和上面的一樣,只是使用了迭代器,使得內存可以只保留一行

f = open('file3.txt','r',encoding='utf-8') #文件句柄
count = 0
for line in f: #一行行讀取文件,內存中只保留一行。
    if count == 9:
        print('------------我是分割線---------------')
        count += 1
        continue
    else:
        print(line.strip())
        count += 1

 

  光標處理:seek()用法

# Author:Tim Gu
f = open('file3.txt','r',encoding='utf-8') #文件句柄
print(f.tell()) #讀取光標坐在位置
print(f.readline()) #讀取一行
print(f.readline()) #讀取第二行
print(f.readline()) #讀取第三行
print(f.tell()) #打印光標所在位置
f.seek(0) #使光標回到原點
print(f.tell()) #打印光標位置
>>>
0
從前現在過去了再不來

紅紅落葉長埋塵土內

開始終結總是沒變改

90
0

  flush()實時將數據寫入磁盤

  打印進度條的小方法: 

# Author:Tim Gu
import sys,time
for i in range(20):
    sys.stdout.write("#")  #sys.stdout方法在同一行打印
    sys.stdout.flush()      #每打印一個#符號寫入一次
    time.sleep(0.3)         #每打印一次隔0.3秒
>>>
####################

  

  truncate() 截斷文件,可以清空文件

# Author:Tim Gu
f = open('file.txt','a',encoding='utf-8')
f.truncate(10)  #保留文件前10個字符,其余截斷

  

  文件的模式:r+讀寫模式:這段代碼會先讀取3行,然后再在文件最后寫入"-------------------------------------"

# Author:Tim Gu
f = open('file.txt','r+',encoding='utf-8') #讀寫
print(f.readline())
print(f.readline())
print(f.readline())
f.write("----------------------------------------------")
print(f.readline())

  文件的模式:w+ 寫讀模式:會創建新文件,此段代碼會覆蓋掉源文件

# Author:Tim Gu
f = open('file.txt','w+',encoding='utf-8') #寫讀
print(f.readline())
print(f.readline())
print(f.readline())
f.write("----------------------------------------------")
print(f.readline())


 

  tell()和seek()聯合使用:

# Author:Tim Gu
f = open('file.txt','w+',encoding='utf-8') #寫讀
f.write("-----------------------------1------------------------")
f.write("\n-----------------------------2------------------------")
f.write("\n-----------------------------3------------------------")
f.write("\n-----------------------------4------------------------")
print(f.tell()) #打印光標所在位置
f.seek(10)   #使光標回到第十個字符的位置
print(f.readline())   #打印當前行
>>>
222
-------------------1------------------------

此時文件內容:

-----------------------------1------------------------
-----------------------------2------------------------
-----------------------------3------------------------
-----------------------------4------------------------should be at the begining of the second line

 

  line.replace的用法,修改文件中的某一行內容:

# Author:Tim Gu
f = open('file3.txt','r',encoding='utf-8')
f_new = open('file3.bak','w',encoding='utf-8')
for line in f:
    if '天邊的你飄泊白雲外' in line:
        line = line.replace('天邊的你飄泊白雲外','aaaaaaaaa')  #修改這一行字符串
    f_new.write(line)
f.close()
f_new.close()

 

   使用with打開文件:

with open('file.txt','r',encoding='utf-8') as f,\
        open('file3.txt','r',encoding='utf-8') as f2:
    for line in f:
        print(line)
    for line in f2:
        print(line)

 

  注:因實際開發過程中,打開文件很容易忘記關閉文件,造成內存不能釋放,所以一般可以選擇使用with open方法打開文件

  
  python3的新特性:x

f = open('1.txt','x',encoding='utf-8') #如果文件存在則報錯,不存在則創建文件並只寫

 

  文件之ab模式:

f = open('1.txt','ab') #使用ab寫文件
f.write(bytes('顧卿',encoding='utf-8')) #因為有b,所以必須傳字節類型,所以使用bytes把字符串轉化為字節類型
f.close()

 

  seek()和tell()的特性:
模式r+一般比較常用,相比較a+,r+可控制指針位置來寫,而a+則永遠只能在末尾寫 

f = open('1.txt','r+',encoding='utf-8') #打開模式是r+(無b),讀取按照字符讀取
data = f.read(1) 
print(f.tell()) #tell當前指針所在的位置(字節)
f.seek(f.tell()) #調整當前指針的位置(字節)
f.write('888') #當前位置開始覆蓋
f.close()

  

  flush()的作用:

f = open('1.txt','a',encoding='utf-8')
f.write('123')
f.flush()  #將緩存內容強制寫進磁盤
input('asdfasd')

 

  seekable():
是否可以移動指針

 

打開兩個文件,將第一個文件的內容寫進第二個文件:

  

with open('1.txt','r',encoding='utf-8') as f1,open('2.txt','w',encoding='utf-8') as f2:
    times = 0
    for line in f1:
        times += 1
        if times <= 10:
            f2.write(line)
        else:
            break
            
讀取第一個文件內容,修改后寫入第二個文件:
with open('1.txt','r',encoding='utf-8') as f1,open('2.txt','w',encoding='utf-8') as f2:
    times = 0
    for line in f1:
        new_str = line.replace('aaaaa','st')
        f2.write(new_str)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM