廖雪峰Python3學(xué)習(xí)筆記-IO編程

本文是筆者學(xué)習(xí)廖雪峰Python3教程的筆記,在此感謝廖老師的教程讓我們這些初學(xué)者能夠一步一步的進(jìn)行下去.如果讀者想學(xué)習(xí)完成的教程,請(qǐng)?jiān)L問廖雪峰Python3教程,筆記如有侵權(quán),請(qǐng)告知?jiǎng)h除...

讀文件

以讀文件的方式打開文件的做法是使用Python內(nèi)置的open()函數(shù),參數(shù)為文件名和標(biāo)識(shí)符

標(biāo)識(shí)符:

r 以只讀方式打開文件懒豹。文件的指針將會(huì)放在文件的開頭。這是默認(rèn)模式粘衬。

rb 以二進(jìn)制格式打開一個(gè)文件用于只讀函匕。文件指針將會(huì)放在文件的開頭楼咳。這是默認(rèn)模式。

r+ 打開一個(gè)文件用于讀寫。文件指針將會(huì)放在文件的開頭惹苗。

rb+ 以二進(jìn)制格式打開一個(gè)文件用于讀寫痛倚。文件指針將會(huì)放在文件的開頭规婆。

w 打開一個(gè)文件只用于寫入。如果該文件已存在則將其覆蓋蝉稳。如果該文件不存在抒蚜,創(chuàng)建新文件。

wb 以二進(jìn)制格式打開一個(gè)文件只用于寫入耘戚。如果該文件已存在則將其覆蓋嗡髓。如果該文件不存在,創(chuàng)建新文件收津。

w+ 打開一個(gè)文件用于讀寫饿这。如果該文件已存在則將其覆蓋。如果該文件不存在撞秋,創(chuàng)建新文件长捧。

wb+ 以二進(jìn)制格式打開一個(gè)文件用于讀寫。如果該文件已存在則將其覆蓋吻贿。如果該文件不存在串结,創(chuàng)建新文件。

a 打開一個(gè)文件用于追加。如果該文件已存在肌割,文件指針將會(huì)放在文件的結(jié)尾卧蜓。也就是說,新的內(nèi)容將會(huì)被寫入到已有內(nèi)容之后把敞。如果該文件不存在弥奸,創(chuàng)建新文件進(jìn)行寫入。

ab 以二進(jìn)制格式打開一個(gè)文件用于追加奋早。如果該文件已存在其爵,文件指針將會(huì)放在文件的結(jié)尾。也就是說伸蚯,新的內(nèi)容將會(huì)被寫入到已有內(nèi)容之后摩渺。如果該文件不存在,創(chuàng)建新文件進(jìn)行寫入剂邮。

a+ 打開一個(gè)文件用于讀寫摇幻。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾挥萌。文件打開時(shí)會(huì)是追加模式绰姻。如果該文件不存在,創(chuàng)建新文件用于讀寫引瀑。

ab+ 以二進(jìn)制格式打開一個(gè)文件用于追加狂芋。如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾憨栽。如果該文件不存在帜矾,創(chuàng)建新文件用于讀寫。

f = open('User/joe/Desktop/test1.py', 'r')

如果文件不存在的話,就會(huì)拋出一個(gè)IOError錯(cuò)誤,來告訴你找不到文件.

open()打開文件之后,就可以使用read()來一次讀取全部的文件,最后需要調(diào)用close()來關(guān)閉文件.但是由于可能會(huì)出現(xiàn)IOError迫使程序運(yùn)行終止,那么就永遠(yuǎn)不會(huì)走到close()方法了.

所以,Python中提供了with()語句來自動(dòng)幫我們調(diào)用close()方法.

with open('User/joe/Desktop/test1.py', 'r') as f:
    f.read()

使用read()方法讀取文件的時(shí)候,是一次性打開全部的內(nèi)容,如果文件很大的話,內(nèi)存就會(huì)出現(xiàn)問題.為了保險(xiǎn)起見,需要在read()方法中傳入一個(gè)size參數(shù),然后反復(fù)調(diào)用read()反復(fù),保證每次讀取合適大小的內(nèi)容,直到最后調(diào)用結(jié)束.除此之外,Python中提供了readlines()方法,來一行一行的讀取文件.

with open('User/joe/Desktop/test1/py', 'r') as f:
    for line in f.readlines():
        print(line.strip())

file-like Object

像open()函數(shù)返回的這種有個(gè)read()方法的對(duì)象屑柔,在Python中統(tǒng)稱為file-like Object.
StringIO就是在內(nèi)存中創(chuàng)建的file-like Object屡萤,常用作臨時(shí)緩沖。

  • 二進(jìn)制文件

    要讀取二進(jìn)制文件掸宛,比如圖片死陆、視頻等等,用'rb'模式打開文件即可

  • 字符編碼

    要讀取編碼文件,需要在open()中傳入encode參數(shù),比如:

    f = open('/User/joe/Desktop/test1.py', encoding = 'gbk')
    f.read()
    

寫文件

寫文件與讀文件一樣,只不過在open()的標(biāo)識(shí)符參數(shù)中傳入 'w'或者'wb'即可.
然后調(diào)用write()方法,寫出文件,最后調(diào)用close()文件關(guān)閉文件即可.

StringIO & BytesIO

很多時(shí)候讀數(shù)據(jù)不一定是從文件中讀, 還有可能從內(nèi)存中讀. 要讀取StringIO,需要先從io中導(dǎo)入StringIO.

寫入數(shù)據(jù)到StringIO中,需要先創(chuàng)建一個(gè)StringIO.然后像文件一樣寫入即可.調(diào)用getvalue()方法獲得寫入的str

from io import StringIO

f = StringIO()
f.write('Hello World')
print(f.getvalue())

從StringIO中讀數(shù)據(jù).使用str初始化一個(gè)StringIO,然后像讀文件一樣讀取數(shù)據(jù).

from io import StringIO

f = StringIO('Hello World')
f.read()

StringIO只能操作str類型的數(shù)據(jù),如果要操作二進(jìn)制數(shù)據(jù)則需要導(dǎo)入BytesIO

BytesIO實(shí)現(xiàn)了在內(nèi)存中讀寫bytes唧瘾,我們創(chuàng)建一個(gè)BytesIO措译,然后寫入一些bytes

from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())

這里寫入的經(jīng)過encode編碼的二進(jìn)制數(shù)據(jù)

與StringIO類似,可以用一個(gè)bytes初始化BytesIO饰序,然后领虹,像讀文件一樣讀取

from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
f.read()

操作文件和目錄

Python內(nèi)置的os模塊可以直接調(diào)用操作系統(tǒng)提供的接口函數(shù)來實(shí)現(xiàn)文件和目錄的操作,操作文件和目錄的函數(shù)一部分放在os模塊中,一部分放在os.path模塊中.

import os
# 查看當(dāng)前目錄的絕對(duì)路徑:
os.path.abspath('.')
'/Users/joe/Desktop'
# 在某個(gè)目錄下創(chuàng)建一個(gè)新目錄菌羽,首先把新目錄的完整路徑表示出來:
os.path.join(os.path.abspath('.'), 'testdir')
'/Users/joe/Desktop/testdir'
# 然后創(chuàng)建一個(gè)目錄:
os.mkdir('/Users/joe/Desktop/testdir')
# 刪掉一個(gè)目錄:
os.rmdir('/Users/joe/Desktop/testdir')

要拆分路徑時(shí)掠械,也不要直接去拆字符串,而要通過os.path.split()函數(shù)注祖,這樣可以把一個(gè)路徑拆分為兩部分猾蒂,后一部分總是最后級(jí)別的目錄或文件名.

os.path.split(/Users/joe/Desktop/testdir)

os.path.splitext()可以直接得到文件擴(kuò)展名.

使用rename()對(duì)文件重命名和remove()刪掉文件.

利用Python的特性來過濾文件。比如我們要列出當(dāng)前目錄下的所有目錄是晨,只需要一行代碼:

[x for x in os.listdir('.') if os.path.isdir(x)] ['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...]

要列出所有的.py文件肚菠,也只需一行代碼:

[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'] ['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']

序列化

我們把變量從內(nèi)存中變成可存儲(chǔ)或傳輸?shù)倪^程稱之為序列化,在Python中叫pickling.序列化之后罩缴,就可以把序列化后的內(nèi)容寫入磁盤蚊逢,或者通過網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器上.反過來,把變量內(nèi)容從序列化的對(duì)象重新讀到內(nèi)存里稱之為反序列化箫章,即unpickling烙荷。

  • 序列化一個(gè)dict
import pickle
d = dict(name = 'joe', age = 24, score = 90)
pickle.dumps(d)

pickle.dumps()方法把任意對(duì)象序列化成一個(gè)bytes,然后檬寂,就可以把這個(gè)bytes寫入文件终抽。或者用另一個(gè)方法pickle.dump()直接把對(duì)象序列化后寫入一個(gè)file-like Object.

import pickle
d = dict(name = 'joe', age = 24, score = 90)
f.open('hhh.py','wb')
pickle.dump(d, f)
f.close()

hhh.py中存儲(chǔ)的就是dict被序列化的內(nèi)容.

當(dāng)我們要把對(duì)象從磁盤讀到內(nèi)存時(shí)桶至,可以先把內(nèi)容讀到一個(gè)bytes昼伴,然后用pickle.loads()方法反序列化出對(duì)象,也可以直接用pickle.load()方法從一個(gè)file-like Object中直接反序列化出對(duì)象镣屹。我們打開另一個(gè)Python命令行來反序列化剛才保存的對(duì)象

f = open('hhh.py', 'rb')
d = pickle.load(f)
f.close()

這樣變量的內(nèi)容又回來,但是這個(gè)變量與之前的只是內(nèi)容相同,并不是一個(gè)變量.

JSON

Python內(nèi)置了Json模塊,將dict轉(zhuǎn)換為json的方法為:

import json
d = dict(name = 'joe', age = 24, score = 90)
json.dumps(d) 

dumps()方法返回一個(gè)str圃郊,內(nèi)容就是標(biāo)準(zhǔn)的JSON.

反序列化是調(diào)用loads()方法

import json
json_str = dict(name = 'joe', age = 24, score = 90)
json.laods(json_str)

如果我們?cè)赿umps的可選參數(shù)deault中不傳入任何參數(shù),Python將無法知道怎么將一個(gè)class序列化,這時(shí)需要寫一個(gè)轉(zhuǎn)換函數(shù)來將class實(shí)例轉(zhuǎn)化為json對(duì)象.
同樣的道理,如果需要反序列化一個(gè)class,同樣需要寫一個(gè)轉(zhuǎn)換函數(shù),傳到object_hook參數(shù)中.

import json

class Studnet(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

s = Student('Joe', 24, 90)

#要序列化s
def student2dict(std):
    return {'name': std.name, 'age': std.age, 'score': std.score}

json.dumps(s, default= student2dict)
# 序列化的結(jié)果
# '{"name": "Bob", "score": 90, "age": 20}'

# 反序列化
json_str = '{"name": "Bob", "score": 90, "age": 20}'
def dict2Student:(dic):
    return Student(dic['name'], dic['age'], dic['score'])

json.loads(json_str, object_hook= dict2Student)
# 反序列化的結(jié)果
#<__main__.Student object at 0x102af07f0>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市女蜈,隨后出現(xiàn)的幾起案子持舆,更是在濱河造成了極大的恐慌,老刑警劉巖伪窖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吏廉,死亡現(xiàn)場離奇詭異,居然都是意外死亡惰许,警方通過查閱死者的電腦和手機(jī)席覆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汹买,“玉大人佩伤,你說我怎么就攤上這事』薇校” “怎么了生巡?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長见妒。 經(jīng)常有香客問我孤荣,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任盐股,我火速辦了婚禮钱豁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疯汁。我一直安慰自己牲尺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布幌蚊。 她就那樣靜靜地躺著谤碳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溢豆。 梳的紋絲不亂的頭發(fā)上蜒简,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音漩仙,去河邊找鬼臭蚁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛讯赏,可吹牛的內(nèi)容都是我干的垮兑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼漱挎,長吁一口氣:“原來是場噩夢啊……” “哼系枪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磕谅,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤私爷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后膊夹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衬浑,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年放刨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了工秩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡进统,死狀恐怖助币,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情螟碎,我是刑警寧澤眉菱,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站掉分,受9級(jí)特大地震影響俭缓,放射性物質(zhì)發(fā)生泄漏克伊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一华坦、第九天 我趴在偏房一處隱蔽的房頂上張望愿吹。 院中可真熱鬧,春花似錦季春、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撵颊,卻和暖如春宇攻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倡勇。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工逞刷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妻熊。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓夸浅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扔役。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帆喇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • IO編程概念 IO在計(jì)算機(jī)中指Input/Output,也就是輸入和輸出亿胸。由于程序和運(yùn)行時(shí)數(shù)據(jù)是在內(nèi)存中駐留坯钦,由C...
    時(shí)間之友閱讀 726評(píng)論 0 0
  • 文件讀寫 讀寫文件是最常見的IO操作。Python內(nèi)置了讀寫文件的函數(shù)侈玄,用法和C是兼容的婉刀。由于文件讀寫時(shí)都有可能產(chǎn)...
    時(shí)間之友閱讀 468評(píng)論 0 0
  • python學(xué)習(xí)筆記 聲明:學(xué)習(xí)筆記主要是根據(jù)廖雪峰官方網(wǎng)站python學(xué)習(xí)學(xué)習(xí)的,另外根據(jù)自己平時(shí)的積累進(jìn)行修正...
    renyangfar閱讀 3,050評(píng)論 0 10
  • 一序仙、讀文件 1突颊、讀取整個(gè)文件 準(zhǔn)備好一個(gè)非空的txt文件 在Linux和Mac OS中,文件路徑中使用斜杠(/)潘悼,...
    SheHuan閱讀 1,104評(píng)論 0 3
  • 性別女洋丐,愛好女 多點(diǎn)人站出來 我們?cè)讲恍桦[藏 然而發(fā)這條狀態(tài)的我 還是屏蔽了175個(gè)人。 這是今天朋友圈看到的 我...
    呆丫閱讀 120評(píng)論 0 0