python(open 文件)


一、open 文件

1.open('file','mode')打開一個文件

  • file  要打開的文件名,需加路徑(除非是在當前目錄)
  • mode  文件打開的模式
  • 需要手動關閉 close

2.with open('file','mode')as...

  • 不需要手動關閉文件

 

二、文件操作模式

1.'r': 以只讀模式打開(默認)(必須保證文件存在)

  • python2.x 文件名中出現漢字時,需在括號內加 u 就不會出現報錯IOError
#python2.x
file1 = open(u"D:\新方碩.txt","r",encoding="gbk")
print file1.read()
file1.close()

#python3.x
file1 = open("D:\新方碩.txt","r",encoding="gbk")
#文件內中文為手動輸入,則需轉碼
print (file1.read().decode('gbk').encode('utf-8'))
file1.close()
  • read(size) 讀取所有
    • 返回字符串
    • 括號接讀取 size 字符
#read()不傳參數時默認讀取所有
f = open("D:\work_doc\CodeFile\Study\\filename")
print(f.read())
f.close()

#結果如下:
"""
這緣分 像一道橋
旌旗飄啊飄
你想走 就請立馬抽刀
愛一筆勾銷
"""

#read(3)括號內參數3代表字符數,1個漢字1個字符
f = open("D:\work_doc\CodeFile\Study\\filename")
print(f.read(3))
f.close()

#結果如下:
"""
這緣分
"""
#文件內容如下
"""
這緣分 像一道橋
旌旗飄啊飄
你想走 就請立馬抽刀
愛一筆勾銷
"""

f = open("D:\work_doc\CodeFile\Study\\filename","r",encoding="gbk")

print(f.read(3))     #讀取完這行后,操作光標已經在第一行末尾了
print(f.read(3),end="")     #所以接下來再次讀取會讀取第二行數據
f.close()

#讀取結果如下
"""
這緣分
 像一
"""
  • readline(size)默認讀取一行
    • 返回字符串
    • 括號內 size 為讀取的子符數
#readline()默認讀取一行
file1 = open("D:\新方碩.txt","r")
print (file1.readline())
file1.close()

#readline(size)括號內填了字符數,則按字符讀取
file1 = open("D:\新方碩.txt","r")
print (file1.readline(5))
file1.close()
#文件內容如下
"""
這緣分 像一道橋
旌旗飄啊飄
你想走 就請立馬抽刀
愛一筆勾銷
"""

f = open("D:\work_doc\CodeFile\Study\\filename","r",encoding="gbk")

print(f.readline(),end="")     #讀取完這行后,操作光標已經在第一行末尾了
print(f.readline(),end="")     #所以接下來再次讀取會讀取第二行數據
f.close()

#讀取結果如下
"""
這緣分 像一道橋
旌旗飄啊飄
"""
  • readlines()讀取所有
    • 返回列表
file1 = open("D:\新方碩.txt","r")
print (str(file1.readlines()).decode('string_escape'))    #轉碼問題
file1.close()
with open('d:\\test1.txt','r') as file1:
    for i in file1.readlines():
        print (i)
#去掉打印出來的換行符
#方法一
f = open("D:\work_doc\CodeFile\Study\\filename","r",encoding="gbk")
data = f.readlines()
for i in data:
    print(i.strip())
f.close()

#方法二
f = open("D:\work_doc\CodeFile\Study\\filename","r",encoding="gbk")
data = f.readlines()
for i in data:
    print(i.splitlines()[0])
f.close()
#文件內容如下
"""
這緣分 像一道橋
旌旗飄啊飄
你想走 就請立馬抽刀
愛一筆勾銷
"""

#對返回的結果中某一行進行處理操作
f = open("D:\work_doc\CodeFile\Study\\filename","r",encoding="gbk")
data = f.readlines()
line = 0
for i in data:
    line += 1
    if line == 4:
        i = "  --".join([i.strip(),"王力宏"])    #往第四行后面添加 "王力宏" 字符串
    print(i.strip())
f.close()

#返回結果如下
"""
這緣分 像一道橋
旌旗飄啊飄
你想走 就請立馬抽刀
愛一筆勾銷  --王力宏
"""
  • 最優讀取文件方法,不占內存
#文件內容如下
"""
這緣分 像一道橋
旌旗飄啊飄
你想走 就請立馬抽刀
愛一筆勾銷
"""

f = open("D:\work_doc\CodeFile\Study\\filename","r",encoding="gbk")
for i in f:    #for循環內部將 f 對象做出了一個迭代器,用一行數據取一行數據,用完后(print)的數據刪除,不占內存空間
    print(i.strip())
f.close()

#返回結果如下
"""
這緣分 像一道橋
旌旗飄啊飄
你想走 就請立馬抽刀
愛一筆勾銷
"""

備注:

  • 調用 read()和readlines() 會一次性讀取文件的全部內容,如果文件有10G,內存就爆了,所以,要保險起見,可以反復調用 read(size) 方法,每次最多讀取 size 個字節的內容。另外,調用 readline() 可以每次讀取一行內容。
  • 如果文件很小,read() 一次性讀取最方便;如果不能確定文件大小,反復調用 read(size) 比較保險;如果是配置文件,調用 readlines() 最方便。

 

2.'w':以只寫模式打開

  • 若文件存在,則會自動清空文件,然后重新創建。
  • 若文件不存在,則新建文件。
  • 使用這個模式必須要保證文件所在目錄存在,文件可以不存在。
file1 = open("D:\\xfs.txt","w")
file1.write("I am python!")
file1.close()
#將test文件內容復制到test1中
file1 = open('d:\\test.txt','r')
file2 = open('d:\\test1.txt','w')
file3 = file2.write(file1.read())
file1.close()
file2.close()
with open('d:\\test.txt','w') as file1:
    file2 = file1.write('緣分一道橋\n歌詞\n男:\n秦時明月漢時關\n萬里長征人未還\n但使龍城飛將在\n不教胡馬度陰山\n女:\n狼煙千里亂葬崗\n'
                        '亂世孤魂無人訪\n無言蒼天筆墨寒\n筆刀春秋以血償\n男:\n談愛恨 不能潦草\n戰鼓敲啊敲\n用信任 立下誓言我來熬\n'
                        '女:\n這緣份 像一道橋\n旌旗飄啊飄\n你想走就請立馬抽刀愛一筆勾銷\n合:\n談愛恨 不能潦草\n紅塵燒啊燒\n以生死 '
                        '無愧證明誰重要\n女:\n這緣份 像一道橋\n故事瞧一瞧\n男:\n走天涯你我卸下戰袍\n合:\n夢回長城謠')
  • 該模式下不能使用 read*() 方法。
#報錯IOError: File not open for reading
file1 = open("D:\\xfs.txt","w")
file1.write("I am python!")
print (file1.read())

 

3.'a':以追加模式打開

  • 若文件存在,則會追加到文件的末尾。
  • 若文件不存在,則新建文件。
  • 該模式不能使用 read*() 方法。
#寫入前文件內容如下
"""
這緣分 像一道橋
旌旗飄啊飄
你想走 就請立馬抽刀
愛一筆勾銷
"""

#進行追加寫入操作
f = open("D:\work_doc\CodeFile\Study\\filename","a")
f.write("\n--王力宏")
f.close()

#寫入后文件內容如下
"""
這緣分 像一道橋
旌旗飄啊飄
你想走 就請立馬抽刀
愛一筆勾銷
--王力宏
"""

 

4.'r+': 以文本讀寫模式打開

  • 可以寫到文件任何位置。
  • 默認寫的指針開始指在文件開頭, 因此會覆寫。
  • 可以使用 read*()
file1 = open(u"D:\\新方碩.txt","r+")
file1.seek(3)
file1.write("HTML")
file1.close()

#默認從第一個子節開始覆寫
file1 = open(u"D:\\新方碩.txt","r+")
file1.seek(3)
file1.write("HTML")
file1.close()
 
5.'w+': 以文本讀寫模式打開(打開前文件會被清空)
  • 文件不存在時,寫入會自動創建文件
f = open("music","w+",encoding="utf8")
f.write("秦時明月漢時關\n")
f.write("萬里長征人未還\n")
f.write("但使龍城飛將在\n")
f.write("不教胡馬度陰山")
f.close()

#結果如下
"""
秦時明月漢時關
萬里長征人未還
但使龍城飛將在
不教胡馬度陰山
"""

 

6.'a+': 以文本讀寫模式打開(寫只能寫在文件末尾)
#寫入前文件內容如下
"""
秦時明月漢時關
萬里長征人未還
"""

f = open("music","a+",encoding="utf8")
f.write("\n--王力宏")
f.close()

#寫入后內容
"""
秦時明月漢時關
萬里長征人未還
--王力宏
"""

 


免責聲明!

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



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