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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...