亚洲免费一级高潮_欧美极品白嫩视频在线_中国AV片在线播放_欧美亚洲日韩欧洲在线看

您現(xiàn)在所在的位置:首頁(yè) >學(xué)習(xí)資源 > Python全棧+人工智能入門教材 > Python基礎(chǔ)入門教程29:企業(yè)級(jí)開發(fā)進(jìn)階1:文件輸入輸出流[IO操

Python基礎(chǔ)入門教程29:企業(yè)級(jí)開發(fā)進(jìn)階1:文件輸入輸出流[IO操

來源:奇酷教育 發(fā)表于:

農(nóng)歷六月初一宜聲明變量 "a ",提交代碼;忌打DOTA,提交BUG適宜方位:坐西朝東多飲水、鮮奶,女神親近指數(shù)較高進(jìn)入正題本節(jié)內(nèi)容如下:什么是

農(nóng)歷六月初一
宜聲明變量"a",提交代碼;忌打DOTA,提交BUG
適宜方位:坐西朝東
多飲水、鮮奶,女神親近指數(shù)較高

進(jìn)入正題

本節(jié)內(nèi)容如下:

  • 什么是IO
  • 文件內(nèi)容操作
    • 操作文本文件
    • 操作二進(jìn)制文件
  • 內(nèi)存IO
    • 初步認(rèn)識(shí)io模塊
  • 目錄和文件的操作
    • 初步認(rèn)識(shí)os模塊
    • 文件的創(chuàng)建、重命名、刪除
    • 目錄的創(chuàng)建、重命名、刪除
  • 序列化操作

1. 什么是IO

IO:Input/Output~輸入/輸出的意思
任何編程語(yǔ)言,核心都是對(duì)數(shù)據(jù)的處理,對(duì)數(shù)據(jù)的處理一般情況下就是指代數(shù)據(jù)的輸入和輸出
常規(guī)情況下,我們?cè)诔绦蜻\(yùn)行的過程中,將數(shù)據(jù)頻繁的輸入或者輸出到計(jì)算機(jī)的內(nèi)存中,讓程序正常的運(yùn)行;
由于程序中的數(shù)據(jù)并不是能持久保存的,所以在一些情況下,我們將數(shù)據(jù)輸入或者輸出到計(jì)算機(jī)中的文件中來進(jìn)行永久保存;
所以各種編程語(yǔ)言中,都提供了豐富并且完善的輸入輸出流的API接口控制數(shù)據(jù)的輸入和輸出(讀/寫)~

運(yùn)行中的程序,可以將數(shù)據(jù)臨時(shí)保存在內(nèi)存中【向內(nèi)存中輸出數(shù)據(jù)】,也可以將內(nèi)存中的數(shù)據(jù)讀取出來在程序中使用【向程序中輸入數(shù)據(jù)】

num = 12 # 將一個(gè)數(shù)據(jù)12,賦值給變量numnum和對(duì)象12被輸出保存到計(jì)算機(jī)內(nèi)存中了
print (num) # 將內(nèi)存中num對(duì)應(yīng)的數(shù)據(jù)12讀取到程序中進(jìn)行答應(yīng),num和對(duì)應(yīng)的對(duì)象數(shù)據(jù)12被輸入到程序中了

內(nèi)存中的數(shù)據(jù)讀取

同樣,運(yùn)行中的程序,可以將數(shù)據(jù)永久保存到文件中【向文件中輸出數(shù)據(jù)】,也可以從文件中讀取數(shù)據(jù)到程序中使用【讀取文件數(shù)據(jù)輸入到程序中】


從文件中讀寫數(shù)據(jù)

2. python中的輸入/輸出

python中提供了標(biāo)準(zhǔn)的輸入/輸出的語(yǔ)法結(jié)構(gòu),在之前的章節(jié)中已經(jīng)進(jìn)行過介紹,我們這里簡(jiǎn)單回顧一下即可
標(biāo)準(zhǔn)輸入:input()函數(shù)操作用于接收用戶數(shù)據(jù),保存數(shù)據(jù)的過程就可以將數(shù)據(jù)寫入到內(nèi)存中
標(biāo)準(zhǔn)輸出:print()函數(shù)用于將指定的數(shù)據(jù)輸出到控制臺(tái)進(jìn)行展示

msg = input("請(qǐng)輸入個(gè)人介紹:")
print("個(gè)人介紹:" + msg)

3. python中對(duì)文件內(nèi)容的操作

文件內(nèi)容也是一種數(shù)據(jù),對(duì)數(shù)據(jù)的操作一般情況下可歸結(jié)為增刪改查四種方式
對(duì)文件內(nèi)容的操作,可以歸結(jié)為讀取、覆蓋、追加的操作。

python中對(duì)文件內(nèi)容的操作主要是通過open()函數(shù)進(jìn)行處理的,open()函數(shù)的簡(jiǎn)單語(yǔ)法結(jié)構(gòu)如下:

open(file, mode="r", buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

# file:是要操作的文件,這里是完整的問文件路徑+文件名稱,如:d:/test.txt

# mode:是操作默認(rèn),默認(rèn)是r,表示可讀的
####  常規(guī)選項(xiàng)如下:
#### r     #### 表示文件以可讀的方式打開,打開的文件只能讀取文件數(shù)據(jù),不能修改
#### w     #### 表示文件以可寫的方式打開,可以操作文件中的數(shù)據(jù),不能做其他操作
#### x     #### 表示文件以執(zhí)行的方式打開,主要用于進(jìn)行文件創(chuàng)建等操作
#### a     #### 表示文件內(nèi)容以追加的方式打開,向文件寫入數(shù)據(jù)不會(huì)覆蓋原來的數(shù)據(jù)
#### b     #### 表示文件以二進(jìn)制的方式進(jìn)行處理,可以操作二進(jìn)制數(shù)據(jù)
#### t     #### 表示文件以文本的方式進(jìn)行處理,也是默認(rèn)的方式
#### +     #### 表示文件以讀寫的方式進(jìn)行處理,是rw結(jié)合起來的用法
#### U     #### 表示使用通用的內(nèi)容換行的方式進(jìn)行處理

# buffering:表示讀寫內(nèi)容的緩沖區(qū),如果設(shè)置為0表示關(guān)閉緩沖區(qū),通常情況下我們會(huì)使用io.DEFAULT_BUFFER_SIZE這個(gè)默認(rèn)值,在不同的操作系統(tǒng)中是4096/8192字節(jié)的長(zhǎng)度

# encoding:打開文件的編碼,這個(gè)選項(xiàng)只能用于操作文本文件的情況下,這個(gè)選項(xiàng)的默認(rèn)值跟文件所在的操作系統(tǒng)有關(guān)

# errors:這個(gè)選項(xiàng)主要用于在encoding選項(xiàng)進(jìn)行編碼和解碼出現(xiàn)錯(cuò)誤時(shí)的操作,值是一個(gè)字符串,python已經(jīng)封裝了字符串對(duì)應(yīng)的處理功能;常規(guī)的選項(xiàng)如下:
#### strict    #### 使用嚴(yán)格模式進(jìn)行處理,如果出現(xiàn)錯(cuò)誤就拋出ValueError異常信息
#### ignore    #### 忽略出現(xiàn)的錯(cuò)誤,這里需要注意,忽略編碼錯(cuò)誤會(huì)導(dǎo)致數(shù)據(jù)丟失的!
#### replace   #### 如果出現(xiàn)編碼錯(cuò)誤,使用特殊符號(hào)替換錯(cuò)誤的編碼,如符號(hào)?

# newline:選項(xiàng)用于控制mode為U時(shí)自動(dòng)換行的處理,可以是如下選項(xiàng)中的一種
#### "None"""、"\n"、"\r""\r\n"
3.1. 操作文本文件
  • 讀取文本文件中的數(shù)據(jù),可以使用read()函數(shù)讀取所有數(shù)據(jù)或者read(size)讀取指定長(zhǎng)度的數(shù)據(jù)或者readlines()讀取整行數(shù)據(jù)
# 以只讀的方式打開系統(tǒng)中d:/test.txt文本文件,讀取其中的數(shù)據(jù)
f = open("d:/test.txt", "r")

# 讀取數(shù)據(jù)到程序中
content = f.read()

# 使用讀取到的數(shù)據(jù)
print(content)

# 操作結(jié)果,記得關(guān)閉文件哦
f.close()

# 執(zhí)行結(jié)果:d:/test.txt中的數(shù)據(jù)被完整的讀取出來了
~hello python!
~輸入輸出流測(cè)試數(shù)據(jù)!

上述代碼在執(zhí)行時(shí),如果操作的文件不存在就會(huì)出現(xiàn)如下錯(cuò)誤,請(qǐng)按照之前的錯(cuò)誤調(diào)試章節(jié)的內(nèi)容分析一下錯(cuò)誤

Traceback (most recent call last):
  File "D:/resp_work/PY_WORK/備課/模塊化開發(fā)/demo06/demo01文件操作.py", line 3, in <module>
    f = open("d:/testtxt", "r")
FileNotFoundError: [Errno 2] No such file or directory: 'd:/test.txt'

另外,在讀取文件數(shù)據(jù)時(shí),一定要注意文件的編碼格式,通常情況下都是使用當(dāng)前操作系統(tǒng)默認(rèn)的編碼,也就是在函數(shù)處理時(shí)忽略encoding選項(xiàng);如同下面的情況就會(huì)出現(xiàn)問題:

我當(dāng)前系統(tǒng)的默認(rèn)編碼是gbk編碼,在d:盤下創(chuàng)建了一個(gè)test2.txt文件,文件編碼修改成了utf-8編碼,此時(shí)執(zhí)行如下代碼:

f = open("d:/test2.txt", "r")
content = f.read()
print(content)
f.close()

我們可以看到和前面的代碼沒有任何區(qū)別,但是執(zhí)行出現(xiàn)如下問題:

Traceback (most recent call last):
  File "D:/resp_work/PY_WORK/備課/模塊化開發(fā)/demo06/demo01文件操作.py", line 26, in <module>
    content = f.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 8: illegal multibyte sequence

這是一個(gè)什么樣的問題呢:報(bào)錯(cuò)提示UnicodeDecodeError也就是編碼錯(cuò)誤,我們修改程序代碼

f = open("d:/test2.txt", "r", encoding="utf-8")
content = f.read()
print(content)
f.close()

重新執(zhí)行程序,數(shù)據(jù)正常讀取了

?這是新的文件內(nèi)容
  • 向文本文件中寫入數(shù)據(jù),一般情況下,可以通過write()函數(shù)或者writelines()函數(shù)向文件中寫入數(shù)據(jù)
# 以可寫的方式打開d:/test.txt文件
# 這里請(qǐng)注意,open()函數(shù)的mode是w模式,如果目標(biāo)文件不存在就會(huì)自動(dòng)創(chuàng)建這個(gè)文件
f = open("d:/test.txt", "w")

# 通過write()函數(shù)向文件中寫入數(shù)據(jù)
f.write("這是Python從程序中寫入到文件的數(shù)據(jù)")

# 操作完成,一定記得關(guān)閉文件哦
f.close()

python程序?qū)懭胛募臄?shù)據(jù)
  • 向文本文件中追加寫入數(shù)據(jù),上面的代碼執(zhí)行的結(jié)果,會(huì)將文件中原來的數(shù)據(jù)覆蓋掉
# 以追加內(nèi)容的方式打開文件
f = open("d:/test.txt", "a")

# 向文件中追加內(nèi)容
f.write("這是新的內(nèi)容")

# 操作完成,記得關(guān)閉文件哦
f.close()

我們打開文件可以看到,原來的數(shù)據(jù)還在,新的數(shù)據(jù)被追加到了后面


追加寫入數(shù)據(jù)
3.2. 操作二進(jìn)制文件
  • 以二進(jìn)制的方式打開文件讀取文件中的數(shù)據(jù)【文本文件也可以按照二進(jìn)制文件的方式讀取】
# 按照二進(jìn)制的方式讀取文件,mode可以設(shè)置為rb兩個(gè)選項(xiàng)配合
f = open("d:/test.txt", "rb")

# 讀取文件數(shù)據(jù)
content = f.read()

# 使用文件中的數(shù)據(jù)
print(content)

# 操作完畢,記得關(guān)閉文件哦
f.close()

# 執(zhí)行結(jié)果如下:
~b'\xd5\xe2\xca\xc7Python\xb3\xcc\xd0\xf2\xd0\xb4\xc8\xeb\xce\xc4\xbc\xfe\xb5\xc4\xca\xfd\xbe\xdd\xd5\xe2\xca\xc7\xd0\xc2\xb5\xc4\xc4\xda\xc8\xdd'
  • 以二進(jìn)制的方式,向文件中寫入數(shù)據(jù)
# 定義要寫入文件中的內(nèi)容
s = "這是python按照二進(jìn)制寫入的數(shù)據(jù)"

# 按照二進(jìn)制的方式打開文件追加內(nèi)容,mode可以設(shè)置為ab兩個(gè)選項(xiàng)配合
f = open("d:/test.txt", "ab")

# 向文件中寫入數(shù)據(jù)
f.write(bytes(s, encoding="utf-8"))

# 使用文件中的數(shù)據(jù)
print(content)

# 操作完畢,記得關(guān)閉文件哦
f.close()

bytes(str, encoding="")這是一個(gè)將字符串轉(zhuǎn)換成字節(jié)數(shù)組的函數(shù),寫入完成后查看文件內(nèi)容如下:


紅色部分是寫入的二進(jìn)制數(shù)據(jù)

輸入輸出流擴(kuò)展:當(dāng)我們開始操作文件的過程中,不可避免的由于文件是否存在,文件內(nèi)存是否可寫等等為讓程序出現(xiàn)異常情況,所以我們要對(duì)文件操作進(jìn)行異常處理,常規(guī)的處理方式有兩種,如下:

  • try-except-finally處理方式
  • with語(yǔ)句處理方式

第一種方式:try-except-finally包含,完成文件操作過程

try:
    f = open("d:/test.txt", "+")
    f.write("寫入文件中的內(nèi)容")
    f.flush()

4. python中對(duì)內(nèi)存IO

python程序?qū)?shù)據(jù)的輸入輸出,不一定都是針對(duì)文件的,也可以是針對(duì)內(nèi)存的處理
常規(guī)情況下,python提供了StringIOBytesIO兩個(gè)內(nèi)置類來進(jìn)行內(nèi)存中數(shù)據(jù)的處理
注意:需要引入python中的io模塊

  • StringIO:在內(nèi)存中讀寫字符串的內(nèi)置類
  • BytesIO:在內(nèi)存中讀寫二進(jìn)制數(shù)據(jù)的內(nèi)置類
4.1 內(nèi)存中讀寫字符串
  • 內(nèi)存中讀寫字符串
    常規(guī)情況下就是創(chuàng)建一個(gè)StringIO對(duì)象,然后按照正常的文件讀寫的方式進(jìn)行內(nèi)容的讀寫即可
# 引入需要的模塊
from io import StringIO

# 創(chuàng)建StringIO對(duì)象
s = StringIO()

# 向內(nèi)存中寫入數(shù)據(jù)
s.write("保存在內(nèi)存中的數(shù)據(jù):用戶名")
s.write("內(nèi)容默認(rèn)是追加的")

# 從內(nèi)存中讀取數(shù)據(jù)
content = s.getvalue()
print(content)

# 操作完成,適當(dāng)?shù)臅r(shí)刻關(guān)閉對(duì)象
s.close()
  • 內(nèi)存中操作二進(jìn)制數(shù)據(jù):和StringIO基本一致
# 引入需要的模塊
from io import BytesIO

# 定義要寫入的數(shù)據(jù),使用bytes()函數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)
s = "這是要寫入的數(shù)據(jù)"
sc = bytes(s, encoding="utf-8")

# 創(chuàng)建BytesIO對(duì)象
b = BytesIO()

# 向內(nèi)存中寫入數(shù)據(jù)
b.write(sc)

# 從內(nèi)存中讀取數(shù)據(jù)
content = b.getvalue()
print(content)

# 操作完成,適當(dāng)?shù)臅r(shí)刻關(guān)閉對(duì)象
s.close()

# 執(zhí)行結(jié)果
~b'\xe8\xbf\x99\xe6\x98\xaf\xe8\xa6\x81\xe4\xbf\x9d\xe5\xad\x98\xe7\x9a\x84\xe6\x95\xb0\xe6\x8d\xae'

5. python中對(duì)目錄/路徑/文件夾的操作

本節(jié)內(nèi)容所有的操作,其實(shí)都是和計(jì)算機(jī)交互的操作~操作計(jì)算機(jī)的內(nèi)存、文件等等,python程序本身是做不了這些事情的,只是python在底層進(jìn)行了和操作系統(tǒng)交互的功能封裝,將操作系統(tǒng)可以執(zhí)行的諸如創(chuàng)建文件、文件內(nèi)容操作、內(nèi)存操作等等封裝成了函數(shù)

簡(jiǎn)單了解os模塊,os模塊主要是針對(duì)操作系統(tǒng)的API的封裝

# 引入os模塊
import os

# 查看操作系統(tǒng)類型
# nt表示windows操作系統(tǒng);posix表示Unix/Linux或者M(jìn)acOS系統(tǒng)
os.name
~ 執(zhí)行結(jié)果:nt

# 查看操作系統(tǒng)中的環(huán)境變量
os.environ
~執(zhí)行結(jié)果:environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\mouwe\\AppData\\Roaming',.................'CLASSPATH': 'D:\\resp_application\\Java\\jdk1.8.0_121\\lib;.;',})
5.1. 操作文件目錄
# 查看當(dāng)前操作系統(tǒng)的絕對(duì)路徑
os.path.abspath(".")
~ 執(zhí)行結(jié)果:D:\resp_work\PY_WORK\demo
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 創(chuàng)建指定單級(jí)目錄
# 語(yǔ)法結(jié)構(gòu):os.mkdir(path, mode=, dir_fd=None)
# 描述:mkdir()函數(shù)用于使用指定的mode選項(xiàng)來創(chuàng)建一個(gè)文件夾目錄
# 參數(shù)path:用于創(chuàng)建文件夾的路徑
# 參數(shù)mode:用于設(shè)置的權(quán)限數(shù)字,默認(rèn)777(所有權(quán)限:讀寫執(zhí)行[rwx])
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 在d盤中創(chuàng)建一個(gè)目錄,目錄名稱為test
os.mkdir("d:/test") 

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 創(chuàng)建指定多級(jí)目錄
# 語(yǔ)法結(jié)構(gòu):os.mkdirs(path, mode=, exist_ok=False)
# 描述:makedirs()函數(shù)用于使用指定的mode選項(xiàng)來創(chuàng)建一系列文件夾目錄
# 參數(shù)path:用于創(chuàng)建文件夾的路徑
# 參數(shù)mode:用于設(shè)置的權(quán)限數(shù)字,默認(rèn)777(所有權(quán)限:讀寫執(zhí)行[rwx])
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 在d盤中創(chuàng)建test文件夾,文件夾中包含test2文件夾,test2中包含test3文件夾
os.mkdirs("d:/test/test2/test3")

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 重命名
# 語(yǔ)法結(jié)構(gòu):os.rename(old, new)
# 描述:rename()函數(shù)用于使用新名稱重命名文件夾或者文件
# 參數(shù)old:要重命名的文件
# 參數(shù)new:文件的新名稱
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
os.rename("d:/test", "d:/new")

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 刪除文件或者目錄
# 語(yǔ)法結(jié)構(gòu):os.rmdir(path)
# 描述:rmdir()函數(shù)用于刪除指定路徑的文件夾或者文件
# 參數(shù)path:要?jiǎng)h除的文件夾或者文件的路徑
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
os.rm("d:/test")

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 刪除多級(jí)文件夾
# 語(yǔ)法結(jié)構(gòu):os.removedirs(path)
# 描述:removedirs(path)
# 參數(shù)path:要?jiǎng)h除的多級(jí)文件夾路徑
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
os.removedirs("d:/test/test2/test3")

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 同樣在進(jìn)行文件夾或者文件刪除的時(shí)候,首先要進(jìn)行數(shù)據(jù)驗(yàn)證
# 也就是首先判斷是文件夾/文件,才去執(zhí)行刪除操作
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# os.path.exists(path)函數(shù)用于判斷指定的路徑是否存在,存在返回True
res = os.path.exists("d:/test")

# os.path.isdir(path)函數(shù)用于判斷指定的路徑是否文件夾,是則返回True
res = os.path.isdir("d:/test")

# os.path.isfile(path)函數(shù)用于判斷指定的路徑是否文件,是則返回True
res = os.path.isfile("d:/test")

對(duì)于文件和文件夾的初步操作,暫時(shí)先分析到這里,再后面的章節(jié)中學(xué)習(xí)過多線程等操作之后再深入分析

>>>更多VR/AR入門教程:VR入門