文件管理


一、文件的操作的初識

利用python代碼寫一個很low的軟件,去操作文件。

文件路徑:path

打開方式:讀,寫,追加,讀寫,寫讀......

編碼方式:utf-8,gbk ,gb2312......

f1 = open('d:\聯系方式.txt', encoding='utf-8', mode='r')
content = f1.read()
print(content)
# 輸出:
練習方式:123456

open:內置函數,open底層調用的是操作系統的借口。

f1是變量,也叫文件句柄。對文件進行的任何操作,都得通過文件句柄。

 

encoding:可以不寫,不寫參數,默認的編碼本:操作系統默認的編碼

Windows:gbk

Linux:utf-8

mac:utf-8

 

f1.close():關閉文件句柄,不然會一直占用內存。

文件操作三部曲

打開文件

對文件句柄進行相應的操作

關閉文件

報錯原因:

UnicodeDecodeError:文件儲存時與文件打開時編碼運用不一致。

第二個錯誤:路徑分隔符產生的問題:加個 r

r'C:\Users\YS\Desktop\聯系方式.txt'

二、文件操作的讀

(1)r 模式:讀取得數據類型是 str ,操作的是文本文件

read(n) :讀幾個字符 ,n不寫默認全讀

f = open('文件的讀.txt',encoding='utf-8')
content = f.read(5)
print(content)
f.close()
# 輸出
讀讀讀讀

readline():讀幾行,寫幾遍,讀幾行

f = open('文件的讀.txt',encoding='utf-8')
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
# 輸出
讀讀讀讀
aaaa
ABCD

readlines():返回一個列表,列表中的每個元素是源文件的每一行。

f = open('文件的讀.txt',encoding='utf-8')
content = f.readlines()
print(content)
f.close()
# 輸出
['讀讀讀讀\n', 'aaaa\n', 'ABCD\n', '!@#¥']

for 讀取,和 for 循環 readlines 一樣的輸出效果

但是 for 讀取始終占用一行的內存,對於大數據的讀取 readlines 因為他會生成一個字典,會一下把內存給占滿(幾十個G的數據)

f = open('文件的讀.txt',encoding='utf-8')
for lin in f:
   print(lin)
f.close()
# 輸出
讀讀讀讀
aaaa
ABCD
@#¥模式
(2)rb模式:

操作的是非文本的文件,圖片,視頻,音頻。rb 模式讀取的數據類型為 bytes

讀取方式和 r 是樣的read(),readline(),readlines(),for

f = open('LOL.png',mode='rb')
conten = f.read()   # 方式和 r 模式是一樣的
print(conten)
f.close()
# 輸出的是bytes數據格式
b'\x89PNG\r\n\x1a\n........'

三、文件操作的寫

(1)w 模式:

有關寫(w)的清空的問題:關閉文件句柄,再次以 w 模式打開此文件時才會清空

write()

# 沒有文件,創建文件,寫入內容,在當前目錄下。
f = open('文件的寫', encoding='utf-8', mode='w') # ’文件的寫‘為文件名
conten = f.write('隨便寫一點。。。')
f.close()
​
# 如果文件存在,先清空原文件內容,在寫入新內容
f = open('文件的寫', encoding='utf-8', mode='w')
conten = f.write('多寫一點。。。')
f.close()
(2)wb 模式,操作非文本文件
f = open('LOL.jpg', mode='rb')
content = f.read()   # 先獲取一個bytes格式的數據
f.close()

# 沒有文件,創建文件,寫入內容 寫入數據格式為bytes(非Unicode編碼)在當前目錄下
f1 = open('LOL2.jpg', mode='wb')
content1 = f1.write(content)
f1.close()

三、文件操作的追加

(1)a 模式
# 沒有文件創建文件,追加內容,有文件就直接在原文件的最后面追加。
f = open('文件的追加', encoding='utf-8', mode='a')
content = f.write('追加一點。。。。')
f.close()

四、文件操作的其他模式

(1)r+ 模式:文件的讀和寫,先讀后寫,讀一個光標往后移一個,寫在最后面光標所在的位置,(讀並追加)
# 讀並追加 順序不能錯,不能創建
f = open('文件的讀寫',encoding='utf-8',mode='r+')
content = f.read()   # 先讀
print(content)
f.write('隨便寫一點。。。')   # 后追加

五、文件操作的其他功能

總結:

三個大方向:

讀,四種模式: r rb r+ r+b

寫,四種模式: w wb w+ w+b

追加:四種模式:a ab a+ a+b

相應的功能:對文件句柄的操作:read,raed(n),readline(),readlines(),write()

tell():方法獲取光標的位置,單位是字節。

f = open('文件的讀寫', encoding='utf-8')
print(f.tell())            # 獲取讀之前光標所在的位置為 0
content = f.read()        # 讀,讀一個字符光標往后移一個字符
print(f.tell())            # 獲取讀之后光標所在的位置為 30
print(content)
# 輸出
0
30
隨便寫一點點點點點點

seek():調整光標的位置

f = open('文件的讀寫',encoding='utf-8')
f.seek(6)                # 把光標的位置調整到第6個字節
print(f.tell())            # 獲取光標的位置為為6
content = f.read()        # 從光標調整的位置開始讀:寫一點點點點點點
print(f.tell())            # 獲取光標讀之后的位置為30
# 輸出
6
30
寫一點點點點點點

flush:強制刷新,相當於保存。

f = open('文件的讀寫', encoding='utf-8', mode='w')
content = f.write('追加一點。。。。')
f.flush()            # 保存一下,Python會自動保存,有些不會
f.close()            # 退出

六、打開文件的另一種方式

with open():

優點1:不用手動關閉文件句柄,會在一定時間關閉

優點2:可以一個語句操作多個文件句柄,一個with可以操作多個open

with open('文件的讀', encoding='utf-8') as f1, \  
     open('文件的追加', encoding='utf-8', mode='a') as f2:
    print(f1.read())
    print(f2.write('追加一點。。'))

\代表這一行代碼沒有完從下一行開始

七、文件操作的改

現存所有的軟件對文件修改都是經歷這五步(底層)

1、以讀的模式打開原文件

2、以寫的模式創建一個新文件。

3、將原文件的內容讀出來修改成新內容,寫入新文件。

4、將原文件刪除。內存級別

5、將新文件重命名成原文件

low版的,因為用的是 read() 只針對小的文件,大的文件 read() 讀的時候就會把內存占滿(一次全讀)

import os
with open('文件的改', encoding='utf-8') as f1, \  # 讀取要讀取的文件
     open('文件的改.txt', encoding='utf-8', mode='w') as f2:  # 新建一個新文件
    low = f1.read()                                            # 讀取
    content_low = low.replace('Python', 'PHP')                # 修改讀取的文件內容
    content_new = f2.write(content_low)                        # 修改后寫入新文件
os.remove('文件的改')                                         # 刪除原文件
os.rename('文件的改.txt', '文件的改')                         # 把新文件改成原文件的名字

進階版。for 每次循環讀取每一行的值,只占用當前一行的內存,占用資源少。

import os
with open('文件的改', encoding='utf-8') as f1, \   # 讀取要改的文件
        open('文件的改.txt', encoding='utf-8', mode='w') as f2:  # 新建一個文件
    for low in f1:                                    # for 循環讀取要改文件的每一行
        content_new = low.replace('Python', 'PHP')    # 每循環一行修改一行
        f2.write(content_new)                        # 修改后的每一寫入新文件
os.remove('文件的改')                                 # 刪除原文件
os.rename('文件的改.txt', '文件的改')                  # 把新文件改成原文件的名字


免責聲明!

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



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