文件操做

文件操做

基本用法

f = open("文件操做.txt", mode='r', encoding="utf-8")
...
f.close()
  • open:表示打開一個文件
  • f:變量,操控文件操做.txt文件的句柄。爲一個可迭代對象
  • f.flush():刷新管道,在向文件裏寫內容時,管道里也會有數據,使用f.flush()可將管道里數據寫入到文件裏。
  • f.close():關閉文件

寫入模式(w)

  • 若是文件名不存在,則建立文件,而後再寫入
  • 若是文件名已存在,則先清空文件內容,而後再寫入
f = open("送別.txt" mode="w", encoding="utf-8")
f.write("下馬飲君酒, 問君何所之?\n")
f.write("君言不得意, 歸臥南山陲。\n")
f.write("但去莫復問, 白雲無盡時。\n")
f.close()

只讀模式(r)

  • read()

1.read():一次性全都讀取出來。弊端:佔內存。若是文件過大,容易致使內存崩潰。python

f = open("送別.txt", mode="r", encoding="utf-8")
content = f.read()
print(content)
f.close() 結果: 下馬飲君酒, 問君何所之? 君言不得意, 歸臥南山陲。 但去莫復問, 白雲無盡時。

2.read(n):讀取n個字符。須要注意的是,若是再次讀取,那麼會在當前位置繼續去讀,而不是從頭讀。app

f = open("送別.txt", mode="r", encoding="utf-8")
content = f.read(5)
print(content)
f.close() 結果: 下馬飲君酒
  • readline():一次讀取一行數據。但每次讀取出來的數據末尾都會有一個\n。
f = open("送別.txt", mode="r", encoding="utf-8")
content = f.readline()
print(content)
f.close() 結果: 下馬飲君酒, 問君何所之?
  • readlines():一次性全都讀取出來,返回的是列表,若是文件過大,容易出現內存崩潰的問題。
f = open("送別.txt", mode="r", encoding="utf-8")
content = f.readlines()
print(content)
f.close() 結果: [
'下馬飲君酒, 問君何所之?\n', '君言不得意, 歸臥南山陲。\n', '但去莫復問, 白雲無盡時。']
  • 循環讀取ui

f = open("送別.txt", mode="r", encoding="utf-8")
for line in f:
    print(line.strip())
f.close()

結果:
下馬飲君酒, 問君何所之?
君言不得意, 歸臥南山陲。
但去莫復問, 白雲無盡時。

追加模式(a)

  • 在追加模式下,咱們寫入的內容會追加在文件的結尾
f = open("送別.txt", mode="a", encoding="utf-8")
f.write("- 王維")
f.close() 結果: 下馬飲君酒, 問君何所之? 君言不得意, 歸臥南山陲。 但去莫復問, 白雲無盡時。
- 王維

路徑

  • 若是文件夾命名爲n或t時,此時\n,\t會被識別爲轉義字符,防止轉義,能夠路徑前加"r"禁止轉義。

絕對路徑

從磁盤根目錄找文件編碼

  • Windows:E:\python\送別.txt
  • Linux:\user\bin\xxx

相對路徑(用的多)

指相對於當前程序所在的文件夾spa

  • 例如文件在上一層文件下的送別.txt:../送別.txt

讀寫字節(rb,wb,ab)

  • b:bytes,讀取和寫入的是字節
  • 應用:用來操做非文本文件(圖片, 音頻, 視頻)
  • 在這些模式下,不能選擇encoding字符集

rb

f = open("送別.txt", mode="rb")
content = f.read()
print(content)
f.close() 結果: b
'\xe4\xb8\x8b\xe9\xa9\xac\xe9\xa5\xae\xe5\x90\x9b\xe9\x85\x92\xef\xbc\x8c \xe9\x97\xae\xe5\x90\x9b\xe4\xbd\x95\xe6\x89\x80\xe4\xb9\x8b\xef\xbc\x9f\r\n\xe5\x90\x9b\xe8\xa8\x80\xe4\xb8\x8d\xe5\xbe\x97\xe6\x84\x8f\xef\xbc\x8c \xe5\xbd\x92\xe5\x8d\xa7\xe5\x8d\x97\xe5\xb1\xb1\xe9\x99\xb2\xe3\x80\x82\r\n\xe4\xbd\x86\xe5\x8e\xbb\xe8\x8e\xab\xe5\xa4\x8d\xe9\x97\xae\xef\xbc\x8c \xe7\x99\xbd\xe4\xba\x91\xe6\x97\xa0\xe5\xb0\xbd\xe6\x97\xb6\xe3\x80\x82'

wb

    wb模式下,能夠不指定打開文件的編碼。可是在寫文件的時候必須將字符串轉化成utf-8的bytes數據,不然報錯:TypeError: a bytes-like object is required, not 'str'code

f = open("送別.txt", mode="wb")
f.write("   五言古詩".encode("utf-8"))
f.close() 結果: 五言古詩

應用

將圖片(長城.jpg)從C盤複製到D盤:視頻

f1 = open(r"c:\長城.jpg", mode="rb")
f2 = open(r"d:\長城.jpg", mode="wb")

for line in f1:
    f2.read(line)

f1.close()
f2.close()

擴展(+)

r+(讀寫)

  • 先讀後寫(正常)
# place.txt:
# 北京
# 上海
# 深圳


f = open("place.txt", mode="r+", encoding="utf-8")
content = f.read()
f.write("廣州")
print(content)
f.close() 結果: 北京 上海 深圳 # place.txt: # 北京 # 上海 # 深圳 # 廣州

注意:在r+模式下,不論讀取多少內容,再次寫入時,都是在末尾寫入對象

送別.txt:
下馬飲 君酒,問君何所之?



f = open("送別.txt", mode="r+", encoding="utf-8")
content = f.read(3)
f.write("\n君言不得意,歸臥南山陲。")
print(content)
f.close()

結果:
下馬飲

送別.txt:
下馬飲君酒,問君何所之?
君言不得意,歸臥南山陲。
  • 先寫後讀(錯誤示範)blog

    若是直接寫入的話,則在開頭寫入,覆蓋開頭的內容圖片

place.txt:
北京
上海
深圳




f = open("place.txt", mode="r+", encoding="utf-8")
f.write("廣州")
content = f.read()
print(content)

f.close()

結果:

上海
深圳

place.txt:
廣州
上海
深圳

w+(寫讀)

  • 若是文件存在,則先清空,再寫入,若是文件不存在,則先建立文件,再寫入。
  • 寫入東西后,光標在末尾,再次讀取時,讀取內容爲空白
f = open("introduction.txt", mode="w+", encoding="utf-8")
f.write("你好,我叫賽利亞")
content = f.read()
print(content)

f.close()


結果:

a+(追加寫讀)

  • 不論光標在何處,寫入時,都是在末尾寫入
f = open("introduction.txt", mode="a+", encoding="utf-8")
f.write("祝你玩的愉快!")
content = f.read()
print(content)

f.close()


結果:



introduction.txt:
你好,我叫賽利亞祝你玩的愉快!

光標

seek(參數1, 參數2)

  • 參數1:偏移量,表示移動多少個單位。
  • 參數2:表示從什麼位置進行偏移。0表示開頭,1表示當前位置,2表示末尾。把光標移動至文件的開頭:seek(0);移至末尾:seek(0, 2)
  • 功能:移動光標
  • 特色:以字節爲單位
introduction.txt:
你好,我叫賽利亞


f = open("introduction.txt", mode="r", encoding="utf-8")
f.seek(3)
content = f.read(3)
print(content)
f.close() 結果: 好,我

tell()

程序返回當前光標的位置

introduction.txt:
你好,我叫賽利亞


f = open("introduction.txt", mode="r", encoding="utf-8")
content = f.read(3)
print(f.tell())  # 9
f.close()

truncate()

默認從開頭截取到光標位置,後面的內容將會被刪除。

introduction.txt:
你好,我叫賽利亞


f = open("introduction.txt", mode="r+", encoding="utf-8")
f.seek(3)
f.truncate()
f.close()


introduction.txt:
你

truncate(n):從開頭載取到n位置,後面的內容將會被刪除。

introduction.txt:
你好,我叫賽利亞


f = open("introduction.txt", mode="r+", encoding="utf-8")
f.truncate(3)
f.close()


introduction.txt:
你

文件修改

    文件操做沒有直接修改文件功能,只能將文件中的內容讀取到內存中,將信息修改完畢,而後將源文件刪除,將新的文件的名字改爲老文件的名字。

import os

with open("唐詩", mode="r", encoding="utf-8") as f1,\
    open("唐詩_副本", mode="w", encoding="utf-8") as f2:
    for line in f1:
        line = line.replace("?", "")
        f2.write(line)

os.remove("唐詩")  # 刪除源文件
os.rename("唐詩_副本", "唐詩")  # 把副本更名爲源文件

文件操做應用

文本文件的複製

f1 = open(r"C:\日記本.txt", mode="r", encoding="utf-8")
f2 = open(r"D:\日記本.txt", mode="w", encoding="utf-8")

for line in f1:
    f2.write(line)

f1.close()
f2.close()

數據統計

data.txt:
序號,名稱,價格,庫存
1,蘋果,5,6000
2,榴蓮,20,5000
3,香蕉,3,2000


with open("data.txt", mode="r", encoding="utf-8") as f:
    titles = f.readline().strip()
    t_list = titles.split(",")

    lst = []
    for line in f:
        dic = {}
        line = line.strip().split(",")
        for i in range(len(line)):
            dic[t_list[i]] = line[i]
        lst.append(dic)
print(lst)


結果:
[{'序號': '1', '名稱': '蘋果', '價格': '5', '庫存': '6000'}, {'序號': '2', '名稱': '榴蓮', '價格': '20', '庫存': '5000'}, {'序號': '3', '名稱': '香蕉', '價格': '3', '庫存': '2000'}]
相關文章
相關標籤/搜索