Python的文件知識 (day07 課堂筆記)

来源:https://www.cnblogs.com/if-it-is-possible/archive/2019/09/02/11449548.html
-Advertisement-
Play Games

今天是Python基礎數據類型的最後一課,今天主要學習的知識是文件。文件主要分為讀文件,寫文件,讀寫文件,寫讀文件..... 首先我們來說只讀文件 我們先看下絕對路徑下的讀文件: open(1,2,3):打開文件,open()裡面的第一個參數是路徑的意思,你存儲的文件絕對路徑,裡面第二個參數是模式, ...


  今天是Python基礎數據類型的最後一課,今天主要學習的知識是文件。文件主要分為讀文件,寫文件,讀寫文件,寫讀文件.....

首先我們來說只讀文件

#1,只讀文件(‘絕對路徑’)
f1 = open('d:\a.txt',mode='r',encoding='utf-8')
content = f1.read()
print(content)
f1.close()

  我們先看下絕對路徑下的讀文件:

  open(1,2,3):打開文件,open()裡面的第一個參數是路徑的意思,你存儲的文件絕對路徑,裡面第二個參數是模式,‘r’在這裡的意思是只讀模式,裡面的

             第三個參數encoding()是編碼方式,一般預設的都是 utf-8 ,因為python文件傳輸存儲的編碼格式都是 utf -8。

  close()  :     關閉文件,我們在最後都要加上close(),如果不加,程式會一直執行,占用記憶體空間

  read()   :  只讀,讀取文件的內容

  我們在看下相對路徑下的讀文件

f1 = open('a',mode='r',encoding='utf-8')
content = f1.read()
print(content)
f1.close()

  我們不難看出相對路徑和絕對路徑的代碼基本上來說是差不多的,有差別的只是open()的一個參數,路徑,路徑被換成了相對路徑。在做程式時,我們使用的相對路徑的頻率遠遠高於絕對路徑。所以我們以後預設使用相對路徑,也希望大家以後也使用相對路徑,少用或不用絕對路徑,因為絕對路徑一旦改變文件的位置,會找不到,會導致我們的程式報錯。、

  說完了只讀文件,下麵來說只寫文件(寫文件我們也可以稱創建文件):

#只寫文件
f1 = open('a',mode='w',encoding='utf-8')
f1.write(' hello python ')
f1.close()

  相對於只讀文件,我們來對比的來看只寫文件,有差別的時open()的第二個參數,mode 由以前的 ‘r’ 換成了 ‘w’. 我們可以看下,執行完此程式的源文件

 hello python 

  對於只寫文件,我們要來講述一個知識點,open()的一個參數,路徑。由於是寫文件,所以存在文件的是否存在,如果文件不存在,就好說了,我們直接執行write(),把咱們要寫的文件直接添加的路徑下的文件就可以了,那麼如果我們要寫的文件之前就存在了呢,並且之前由數據了呢?我們怎麼辦。我們來看下如下代碼:

a = open('1',mode='w',encoding='utf-8')
a.write('hello')        #hello
a.close()
b = open('1',mode='w',encoding='utf-8')
b.write('hi')
b.close()               #hi

  我們不難發現當我們往 1 這個文件里存儲 ‘hello’ 以後,我們再存儲‘hi’,源文件只剩 ‘hi’ 這個字元里,所以我們得出:對於寫,沒有此文件就會創建文件,如果有文件,就會把源文件內容刪除,再寫新的內容(覆蓋)。

  講述了只讀文件和只寫文件,我們對文件有了一些大概的瞭解,下麵我們來說bytes類型的只讀和只寫文件。下麵來看下代碼:

只寫文件:
a = open('1',mode='wb') a.write('hello'.encode('utf-8')) #hello a.close()

只讀文件:
a = open('1',mode='rb')
content = a.read()
print(content)
a.close()

  下麵我首先來說下bytes類型,bytes類型是以 utf-8 的編碼方式編碼的一種類型,那麼我們為什麼用bytes ? 我們在剛纔學習的只讀和只寫,只能讀取和寫入一些文本信息,在我們的生活中,肯定不可能都只是文本,應該也會大量瀏覽圖片或者音頻等其他的方式,那麼bytes的作用就來了,它是用於非文字類的文件上傳和下載時使用。

  首先說下bytes類型的只讀文件,首先open()第三個三個參數被取消了,不再用編碼(encoding),它是以什麼方式存儲,就打開什麼方式。

  最後我們說下read(),我們知道,content的數據類型讀取的是bytes類型,但是列印出來content卻是str, 那麼問題來了,(因為str採用的是Unicode的編碼方式,而我們上傳下載和存儲的bytes編碼方式是utf-8,但是卻列印出來了字元串,) 這是為什麼呢?

  是read() , 隱藏了 bytes -> str

  下麵說下bytes類型的只寫文件,同樣open()第三個三個參數被取消了,不再用編碼(encoding),但是相對於之前的只寫文件卻出現了一些差異,我們在write()裡面進行了編碼的轉化,eg.

a.write('hello'.encode('utf-8')) 

  很多人會問了,為什麼這段代碼什麼意思?為什麼這樣寫呢?
  其實還是那個意思,'hello',眾所周知,它是str類型,str是什麼編碼方式?Unicode吧,但是在python中,上傳下載不允許直接使用Unicode,預設支持的是‘utf-8’,同時encode()使str的方法,所以在這個位置進行修改編碼方式

  講完了只寫文件,很多人就會問博主了,我們寫入只能覆蓋,可是這樣始終只能存一個值啊,我們能不能存多份值呢,有什麼方法嗎?比如說我們列表的append()方法.......,其實我們文件也是有追加的:

#追加:
a = open('1',mode='a',encoding='utf-8')
a.write('hello')
a.close()
#bytes類型:
a = open('1',mode='ab')
a.write('xiaoming'.encode('utf-8'))
a.close()

  相對於只寫的代碼,我們可以看出,mode = 'a' ,它有以前的‘w’變成了‘a’,當然功能也隨之改變,它是追加的意思,相當於列表的append()方法。(在之後我們就不具體說明bytes類型了,因為意思和之前所描述的只讀和只寫差不多,所以在之後就不進行過多的描述了。)

  那麼我們很多人就會有疑問了,問什麼‘a’能添加而‘w’卻只能覆蓋呢?在這裡先大概說下,是游標的原因

r :游標在字元的最後面
w :游標在字元的最前面
a :游標移動到有文字的最後一位

  文件的讀寫:(只能進行一次讀寫)

# f = open('log',mode='r+',encoding='utf-8')
# print(f.read())
# f.close()
# f = open('log',mode='r+b')
# print(f.read())
# f.write('大猛,小孟'.encode('utf-8'))
# f.close()

  文件的寫讀:

# f = open('log',mode='w+',encoding='utf-8')
# f.write('aaa')
# f.seek(0)
# print(f.read())
# f.close()

  文件的追加寫讀:

# f = open('log',mode='a+',encoding='utf-8')
# f.write('佳琪')
# f.seek(0)
# print(f.read())
# f.close()

  下麵來介紹文件的方法:

# obj = open('log',mode='r+',encoding='utf-8')
# content = f.read(3)  # 讀出來的都是字元
# f.seek(3)  # 是按照位元組定游標的位置
# f.tell() 告訴你游標的位置
# print(f.tell())
# content = f.read()
# print(content)
# f.tell()
# f.readable()  # 是否刻度
# line = f.readline()  # 一行一行的讀
# line = f.readlines()  # 每一行當成列表中的一個元素,添加到list中
# f.truncate(4)
# for line in f:
#     print(line)
# f.close()

  在文件中,open()我們還有另外一種寫法,比較常用,以後我們大多用這個寫法:

# with open('log',mode='r+',encoding='utf-8') as f,\
#         open('log',mode='w+',encoding='utf-8') as f1:

  這個寫法是不用寫close()的。

  最後我介紹下斷點續傳的問題:

1.先知道游標的位置    -> tell()
2.將游標調製到特定的位置 -> seek(tell())

最後留一個小題:

  通過文件實現,之前做過的三次驗證用戶登陸:

#方法一:

print('請先註冊用戶信息')
username = input('please input the username :')
password = input('please input the password :')
f1 = open('message',mode='w+',encoding='utf-8')
f1.write(username)
f1.seek(0)
f2 = open('password',mode='w+',encoding='utf-8')
f2.write(password)
f2.seek(0)
print('您準備註冊還是登陸,如果登陸請輸入G , 如果想繼續註冊輸入 I ,如果退出請輸入 E')
s1 = input('<<<')
if s1.upper() == 'G':
    i = 3
    while i > 0:
        user = input('please input the username :')
        word = input('please input the password :')
        if f1.read() == user and f2.read() == word:
            print('welcome to enter , loading......')
            break
        elif f1.read() != user or f2.read() != word:
            i -= 1
            print('Fuck off ,please input continue , you have ' + str(i) + ' times')
            continue
elif s1 .upper() == 'I':
    username = input('please input the username :')
    password = input('please input the password :')

    f1 = open('message', mode='w+', encoding='utf-8')
    f1.write(username)
    f1.seek(0)
    f2 = open('password', mode='w+', encoding='utf-8')
    f2.write(password)
    f2.seek(0)
else:
    exit('exiting....')

f1.close()
f2.close()


#方法二

username = input('please input the username :')
password = input('please input the password :')
with open('mess',mode='w+',encoding='utf-8') as f:
    f.write('{}\n{}'.format(username,password))
print('恭喜你註冊成功!')
i = 0
a = []
while i < 3:
    user = input('please input the username :')
    pswd = input('please input the password :')
    with open('mess',mode='r+',encoding='utf-8')as f1:
        for line in f1:
            a.append(line)
        a[0] = a[0].rstrip('\n')
        if user == a[0] and pswd == a[1] :
            print('登陸成功!')
            break
        else:
            print('登陸失敗')
            i += 1

 

下麵是3到關於文件的作業題:

1. 文件a.txt內容:每一行內容分別為商品名字,價錢,個數。

apple 10 3

tesla 100000 1

mac 3000 2

lenovo 30000 3

chicken 10 3

通過代碼,將其構建成這種數據類型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 並計算出總價錢。



li = []
with open('a',mode='r',encoding='utf-8') as f1 :
    for line in f1 :
        le = line.strip().split()
        if len(le) != 0 :
            lisl = {'name':le[0],'price':le[1],'amount':le[2]}
            li.append(lisl)
print(li)
num = 0
for lis in li:
    num = num + int(lis['price']) * int(lis['amount'])
print(num)


2,有如下文件:

-------

alex是老男孩python發起人,創建人。

alex其實是人妖。

誰說alex是sb?

你們真逗,alex再牛逼,也掩飾不住資深屌絲的氣質。

----------

將文件中所有的alex都替換成大寫的SB。

with open('b',mode='r+',encoding='utf-8') as f1 :
    for i in f1:
        if 'alex' in i :
            i = i.replace('alex','SB')
            print(i)


3.進行文件的修改操作:

with open('text01',encoding='utf-8') as f1 ,open('text02','w',encoding='utf-8') as f2:
    for line in f1:
        if '你好啊' in line :
            line = line.replace('你好啊','hello')
        f2.write(line)
import os
os.remove('text01')
os.rename('text02','text01')

 

之後我將開啟自己Python的函數之旅..........

 

  

 

 

  

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JVM調優的目的是保證在**一定吞吐量**的情況下儘可能的**減少GC次數**,從而減少系統停頓時間,提高服務質量和效率。 ...
  • 使用一個polygon矢量提取某個文件夾中所有的tif格式柵格數據 (要確保先安裝好arcpy包) 2019-09-02 23:53:36 ...
  • Java練習——撲克牌發牌器聲明:學習自其他博主,感謝分享,這裡自己也寫了一下。實現思路 - 構建一張撲克牌 - 構建一套撲克牌 - 測試 構建一張撲克牌 構建一套撲克牌 測試 結果: 玩家1紅桃6 方塊4 方塊A 黑桃4 草花2 紅桃Q 紅桃J 紅桃K 方塊3 黑桃K 方塊8 黑桃7 黑桃5 玩家 ...
  • 資料庫連接池原理-傳統方式 當有多個線程,每個線程都需要連接資料庫執行SQL語句的話,那麼每個線程都會創建一個連接,並且在使用完畢後,關閉連接。創建連接和關閉連接的過程也是比較消耗時間的,當多線程併發的時候,系統就會變得很卡頓。同時,一個資料庫同時支持的連接總數也是有限的,如果多線程併發量很大,那麼 ...
  • 在使用Spring整合MyBatis的時候遇到控制台報錯:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xyfer.dao.UserDao.findById 詳細信息如下: 這 ...
  • 一.編程語言介紹與分類 1.什麼是編程語言 編程語言本質就是人類的語言,主要用於溝通交流。我們通過編程語言與電腦進行互動交流,從而使電腦來幫助我們實現一些特定的功能和一些複雜的工作。 2.編程語言的分類 編程語言可以分為機器語言、彙編語言、高級語言。機器語言是電腦底層的語言,直接與硬體打交道, ...
  • 字元集分為:ASCII碼 GBK Unicode(萬國碼) utf-8; ASCII碼是國外版,僅支持英文編碼,一個英文占用一位(byte); GBK 是國人補充的編碼,支持中文的書寫,一個字元占用兩位(byte); Unicode 是將多個國家的編碼進行統一整合,但是一個英文占用兩位(byte); ...
  • Spring Security 解析(四) —— 簡訊登錄開發   在學習Spring Cloud 時,遇到了授權服務oauth 相關內容時,總是一知半解,因此決定先把Spring Security 、Spring Security Oauth2 等許可權、認證相關的內容、原理及設 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...