day12_文件操作

前言回顧

1.函數(shù)作為變量

實(shí)參高階函數(shù)、返回值高階函數(shù)
列表.sort(),sorted(),max(),min()函數(shù)中key參數(shù)
key要求:一個(gè)函數(shù)、有一個(gè)參數(shù)、有一個(gè)返回值

2.迭代器和生成器

迭代器:將其他序列轉(zhuǎn)換成迭代器、生成器
獲取元素:next(),for-in !脾还!僅有兩種

iter1 = iter('hello')
print(next(iter1))
print(iter1.__next__())  # 不常用
print(next(iter1))

for x in iter1:
    print(x)

生成器:調(diào)用帶有yield生成器關(guān)鍵字的函數(shù),就可以得到一個(gè)
一個(gè)生成器能夠產(chǎn)生多少數(shù)據(jù)入愧,看函數(shù)執(zhí)行完成會遇到多少次yield

def func1(num, pre=''):
    width = len(str(num))
    for x in range(1, num+1):
        yield pre+str(x).zfill(width)

id_gen = func1(100)
print(next(id_gen))
print(next(id_gen))

id_gen2 = func1(50, 'py1902')
print(next(id_gen2))

# 每次都會創(chuàng)建新的生成器然后獲取第一個(gè)元素
print('===:', next(func1(60)))
print('===:', next(func1(60)))  # 這是生成了兩個(gè)生成器
# 所以需要保存

1.生成式

生成式本質(zhì)還是生成器鄙漏,只是寫法更簡潔
1)生成式的寫法

a.語法1:
(表達(dá)式 for 變量 in 序列)

b.展開:
def func():
    for 變量 in 序列:
        yield 表達(dá)式
func()

c.說明:
()  -  固定寫法
表達(dá)式  -  除了賦值語句以外的任何語句嗤谚,比如:數(shù)據(jù)、賦值過的變量怔蚌、運(yùn)算表達(dá)式巩步、函數(shù)調(diào)用表達(dá)式等
           這個(gè)表達(dá)式一般都和后面的變量有聯(lián)系
  1. 語法二:
a.語法
(表達(dá)式 for 變量 in 序列 if 條件語句)

b.展開
def func():
    for 變量 in 序列:
        if 條件語句:
            yield 表達(dá)式
gen = func()
  1. 補(bǔ)充:python的三目運(yùn)算符
c語言  -  條件語句?值1:值2  (條件語句為真桦踊,表達(dá)式結(jié)果為值1椅野,否則是值2)
python  -  值1 if 條件語句 else 值2  (如果條件語句為真整個(gè)表達(dá)式的結(jié)果為值1,否則為值2)
print('=====補(bǔ)充=====以下')
a = 10
b = 20
result = a if a > b else b
print(result)

# 展開
if a > b:
    result = a
else:
    result = b
print('=====語法2=====以下')
gen = ('str%d' % x for x in range(15) if x % 2)

for item in gen:
  print(item)
# str1, str3, str5, str7, str9, str11, str13
print('=====語法1=====下面')
gen1 = (10*x for x in range(5))  # for循環(huán)控制著生成器的數(shù)據(jù)數(shù)量
print(gen1)
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
# print(next(gen1))  # StopIteration

gen2 =('str'+str(x) for x in range(15))
for str1 in gen2:
    print(str1)

交換字典中key和value的值

dict1 = {'a': 1, 'b': 2, 'c': 3}
gen3 = ((value, key) for key, value in dict1.items())
print(next(gen3))  # (1, 'a')
print(dict(gen3))  # {2: 'b', 3: 'c'}
一句話實(shí)現(xiàn)交換一個(gè)字典的key和value(面試題)
dict1 = {'a': 1, 'b': 2, 'c': 3}
newdict = dict(((value, key) for key, value in dict1.items()))
print(newdict)

# 展開
def func():
    for key, value in dict1.items():
        yield value, key  # 沒寫括號籍胯,元組的寫法

gen = func()
dict2 = dict(gen)
print(dict2)
# [(1, 'a'),(2, 'b'),(3, 'c')]  ->  {1: 'a', 2: 'b', 3: 'c'}
# for item in gen:
#     print(item)
練習(xí)實(shí)現(xiàn)自己的dict()函數(shù)竟闪,可以將序列轉(zhuǎn)換成字典
def yt_dict(seq):
    temp = {}
    for item in seq:
        if len(item) != 2:
            raise ValueError  # 拋出異常
        list1 = list(item)
        temp[list1[0]] = list1[1]
    return temp
dict2 = yt_dict([(1, 3), (3, 8), (10, 2)])
print(dict2)

def my_dict(seq):  # mine
    dict1 = {}
    for item in seq:
        if len(item) != 2:
            return False
        else:
            dict1[item[0]] = item[1]
    return dict1

print(my_dict([(1, 'a'), (2, 'b'), (3, 'c')]))

list1 = list('abc')
# 解析內(nèi)部轉(zhuǎn)換過程
def my_list(seq):
    temp = []

1.數(shù)據(jù)持久化

程序中產(chǎn)生的數(shù)據(jù)默認(rèn)保存在內(nèi)存中,程序數(shù)據(jù)會自動(dòng)銷毀杖狼。
如果希望程序結(jié)果數(shù)據(jù)不銷毀炼蛤,那么需要對這個(gè)數(shù)據(jù)做數(shù)據(jù)持久化
!! 內(nèi)存是計(jì)算機(jī)的工作場所,硬盤用來存放暫時(shí)不用的信息

數(shù)據(jù)持久化:將數(shù)據(jù)保存到文件中蝶涩,然后將文件保存在磁盤/硬盤中

2.文件操作(對文件內(nèi)容進(jìn)行操作)

基本步驟:打開文件 -> 操作文件(讀/寫) -> 關(guān)閉文件(文件對象.close())

  1. 打開文件

open(file, mode='r, encoding=None) - 以指定的方式打開文件理朋,并且返回文件對象

說明:
file - 文件路徑,可以寫絕對路徑绿聘,也可以寫相對路徑
a.絕對路徑(一般不用) - 完整路徑嗽上,文件在硬盤上真正存在的路徑 如:D:/wamp/www/img/icon.jpg
b.相對路徑(需要先將文件保存在工程目錄下) - 就是自己相對與目標(biāo)位置。
.\ - 代表當(dāng)前目錄(當(dāng)前目錄可以省略.)
..\ - 代表當(dāng)前目錄的上層目錄
...\ - 代表當(dāng)前目錄的上層目錄的上層目錄
以此類推
注意:當(dāng)前目錄指的是當(dāng)前代碼所在的文件對應(yīng)的目錄
(Mac操作系統(tǒng)路徑為:/ windows操作系統(tǒng)路徑為:)

mode - 字符串斜友,文件的打開方式(決定打開文件后能夠進(jìn)行的操作炸裆,和操作方式)
'r' - 以只讀的方式打開文件垃它,讀出來的數(shù)據(jù)是字符串
'w' - 以只寫的方式打開文件鲜屏,寫入的數(shù)據(jù)是字符串(覆蓋原文件內(nèi)容)
'rb'/'br' - 以只讀的方式打開文件,讀出來的數(shù)據(jù)是二進(jìn)制數(shù)據(jù)
'wb'/'bw' - 以只寫的方式打開文件国拇,寫入的數(shù)據(jù)是二進(jìn)制數(shù)據(jù)
'a' - 以只寫的方式打開文件洛史,寫入的數(shù)據(jù)是字符串(在原文件的最后添加內(nèi)容)
注意:如果是以讀的方式打開文件,文件不存在會出現(xiàn)異常(報(bào)錯(cuò):FileNotFindError)
如果是以寫的方式打開文件酱吝,文件不存在不會報(bào)錯(cuò)也殖,并且會自動(dòng)創(chuàng)建這個(gè)文件

encoding - 字符,文本編碼方式(數(shù)據(jù)的展示)
'utf-8'(mac默認(rèn)) - 支持中文
'gbk'(windows默認(rèn)) - 只支持英文
注意:只有文本文件才能設(shè)置encoding务热,二進(jìn)制操作不能設(shè)置encoding

查看一個(gè)系統(tǒng)方法忆嗜,進(jìn)入dos命令,輸入ipython崎岂,然后輸入help(函數(shù)名)

print('=====打開文件')
# 使用絕對路徑打開test.txt文件
open('E:\Python_space\day12文件操作\\files\\test.txt')
# 使用相對路徑打開文件
open('.\\files\\test.txt')

# f保存文件對象捆毫,只有打開文件才能得到文件對象
f = open('files\\test.txt', 'r', encoding='utf-8')
# f = open(r'files\test.txt', 'r', encoding='utf-8') 前面加r,防止反編譯
  1. 操作文件
    1.讀操作:
    文件對象.read() - 返回文件中的內(nèi)容(從讀寫位置獲取到文件結(jié)尾)
    文件對象.readline() - 讀一行內(nèi)容(從讀寫位置)
f = open('files\\test.txt', 'r', encoding='utf-8')
print('=====讀取全部數(shù)據(jù)=====')
content = f.read()  # 讀取所有數(shù)據(jù)
print(type(content))
print(content)
print('===:', f.read())  # 數(shù)據(jù)讀取完畢后冲甘,不能再讀出數(shù)據(jù)(相當(dāng)于光標(biāo))

# 設(shè)置讀寫位置在文件開頭
f.seek(0)
print('more one=:', f.read())
f.close()

print('=====讀取一行數(shù)據(jù)=====')
f1 = open('files\\test.txt', 'r', encoding='utf-8')
print(f1.readline())
print(f1.readline())
# 讀不到內(nèi)容的時(shí)候返回空串
content = f1.readline()
print('===:', content, type(content))
f1.close()

練習(xí):讀一個(gè)本地的txt文件中的內(nèi)容绩卤,一行一行的讀途样,讀完為止

print('===練習(xí):')
f2 = open('files\\test1.txt', 'r', encoding='utf-8')
con = f2.readline()
while con:
    print(con)
    con = f2.readline()

# while True:
#     content = f2.readline()
#     print(content)
#     if not content:
#         break
f2.close()

2.寫操作
文件對象.write(內(nèi)容) - 將內(nèi)容寫入指定文件
'w'/'a' - 內(nèi)容要求是字符串類型
'bw'/'wb' - 內(nèi)容要求是二進(jìn)制(bytes)
w - 直接覆蓋原文件
a - 在原文件的基礎(chǔ)上追加

f3 = open(r'files\test.txt', 'w', encoding='utf-8')
f3.write('嗷嗚,惡龍咆哮')

3.二進(jìn)制數(shù)據(jù)(bytes)

  1. 數(shù)據(jù)來源:
    a.將其他類型轉(zhuǎn)換成bytes類型:
    整型和字符串都可以轉(zhuǎn)換成bytes
    b.以'rb'/'br'的方式讀文件
# 整型轉(zhuǎn)bytes
print(bytes(10))
# 布爾轉(zhuǎn)bytes
print(bytes(True))
# 字符串轉(zhuǎn)bytes
b1 = bytes('你好', encoding='utf-8')
print(b1)
b2 = '你好'.encode()
print(b2)
# 將bytes轉(zhuǎn)字符串
str1 = str(b1)  # 輸出這個(gè)二進(jìn)制字符串
print('str1:', str1)  # str1: b'\xe4\xbd\xa0\xe5\xa5\xbd'

str1 = str(b1, encoding='utf-8')  # 將這個(gè)二進(jìn)制進(jìn)行編碼濒憋,輸出字符串
print('str1:', str1)  # str1: 你好

str1 = b1.decode(encoding='utf-8')
print('str1:', str1)

f4 = open(r'files\test.txt', 'wb')
f4.write('abc'.encode())

# f4 = open(r'files\test.txt', 'wb')
# f4.write('abc')

3.二進(jìn)制文件的讀寫

圖片何暇,視頻,音頻等都是二進(jìn)制文件凛驮,這些文件只能以帶'b'的方式打開然后操作

# 二進(jìn)制讀操作
image_f = open('files\兔子.jpg', 'rb')
image_data = image_f.read()
print(type(image_data), image_data)

# 二進(jìn)制寫操作
n_f = open('new.jpg', 'wb')  # [寫]的時(shí)候打開一個(gè)不存在的文件裆站,會創(chuàng)建一個(gè)新的文件
n_f.write(image_data)        # 'w','a','wb'

1.打開文件

with open() as 文件對象:
文件的操作
上述代碼功能如下:
文件對象 = open()
文件操作
文件關(guān)閉.close()

2.數(shù)據(jù)持久化

0.要為這個(gè)數(shù)據(jù)創(chuàng)建對應(yīng)的本地文件
1.程序中需要這個(gè)值的時(shí)候,從文件中去讀取這個(gè)數(shù)據(jù)的值
2.這個(gè)數(shù)據(jù)的值發(fā)生改變以后要將最新的數(shù)據(jù)更新到本地文件中

練習(xí):統(tǒng)計(jì)程序啟動(dòng)次數(shù)(將當(dāng)前程序的啟動(dòng)次數(shù)打印出來)

# 1.將數(shù)據(jù)從文件中讀出來
with open('newfile.txt', 'r', encoding='utf-8') as f:
    count = int(f.read())

# 2.更新數(shù)據(jù)
count += 1
print(count)

# 3.更新文件
with open('newfile.txt', 'w', encoding='utf-8') as f:
    f.write(str(count))

# [
#     {'name': '小明', 'age': 23},
#     {'name': '張三', 'age': 19}
# ]

import json
(需要導(dǎo)入模塊黔夭,import語句一般寫在文件開頭)

1.什么是json數(shù)據(jù)(特別重要遏插,實(shí)用性!)

滿足json格式要求的數(shù)據(jù)就是json數(shù)據(jù)纠修;文件內(nèi)容滿足json格式要求胳嘲,就是json文件

  1. json格式要求:

a.要求一個(gè)json中有且只有一個(gè)數(shù)據(jù) b.這個(gè)數(shù)據(jù)必須是json支持的數(shù)據(jù)類型的數(shù)據(jù)

  1. json支持的數(shù)據(jù)類型

數(shù)字類型(number) - 包含所有的數(shù)字(整數(shù)和小數(shù)),并且支持科學(xué)計(jì)數(shù)法,例如:10,23.1,3e2
字符串(string) - 使用[雙引號]引起來的字符集,支持轉(zhuǎn)義字符扣草,例如"abc","12山東黃金","123\nabc","\u4e00"
布爾(bool) - 只有true了牛,false兩個(gè)值(和python不同,關(guān)鍵字為小寫)
數(shù)組(array) - 相當(dāng)于python中的列表辰妙,[12, "abc", true, [1, 3]]
字典(dictionary) - 相當(dāng)于python中的字典鹰祸,{"name": "小明","age": 18} 但是key值只能為字符串,value任意
null - 相當(dāng)于None,空值
"""

2.python數(shù)據(jù)和json數(shù)據(jù)的相互轉(zhuǎn)換

python中內(nèi)置了一個(gè)json模塊密浑,用來支持json相關(guān)操作 (需要導(dǎo)入模塊蛙婴,import語句一般寫在文件開頭)

  1. json轉(zhuǎn)python

json (轉(zhuǎn)) python
數(shù)字 int/float
字符串 str,有可能將雙引號變成單引號
布爾 bool,true -> True,false -> False
數(shù)組 list
字典 dict
null None

  1. json轉(zhuǎn)python方法

json.loads(字符串, encoding=編碼方式) - 將json字符串轉(zhuǎn)換成python對應(yīng)的數(shù)據(jù)
注意:這兒的字符串要求字符串中的內(nèi)容必須是json格式數(shù)據(jù)(去掉字符串最外面的引號,本身就是一個(gè)json數(shù)據(jù))

result = json.loads('"abc"', encoding='utf-8')
print([result])

result = json.loads('true', encoding='utf-8')
print([result])

result = json.loads('[12, true, "abc", null]', encoding='utf-8')
print(result, type(result))
  1. python轉(zhuǎn)json

python (轉(zhuǎn)) json
int/float 數(shù)字
bool 布爾,True -> true,False -> false
str 字符串尔破,單引號會變成雙引號
list/tuple 數(shù)組
dict 字典
None null

  1. python轉(zhuǎn)json方法

json.dumps(數(shù)據(jù)) - 將python數(shù)據(jù)轉(zhuǎn)換成json格式的字符串

result = json.dumps(100)
print([result])

result = json.dumps('hello python')
print([result])

result = json.dumps(True)
print([result])

result = json.dumps({'abc': 23, 'name': '小明', 'gender': True, 'score': None})
print([result])

with open(r'files\test2.txt') as f:
    content = f.read()
    dict1 = json.loads(content, encoding='utf-8')
    print(dict1['age'])
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末街图,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子懒构,更是在濱河造成了極大的恐慌餐济,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胆剧,死亡現(xiàn)場離奇詭異絮姆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)秩霍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門篙悯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铃绒,你說我怎么就攤上這事鸽照。” “怎么了匿垄?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵移宅,是天一觀的道長归粉。 經(jīng)常有香客問我,道長漏峰,這世上最難降的妖魔是什么糠悼? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮浅乔,結(jié)果婚禮上倔喂,老公的妹妹穿的比我還像新娘。我一直安慰自己靖苇,他們只是感情好席噩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贤壁,像睡著了一般悼枢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脾拆,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天馒索,我揣著相機(jī)與錄音,去河邊找鬼名船。 笑死绰上,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渠驼。 我是一名探鬼主播蜈块,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼迷扇!你這毒婦竟也來了百揭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谋梭,失蹤者是張志新(化名)和其女友劉穎信峻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓮床,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年产镐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隘庄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡癣亚,死狀恐怖丑掺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情述雾,我是刑警寧澤街州,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布兼丰,位于F島的核電站,受9級特大地震影響唆缴,放射性物質(zhì)發(fā)生泄漏鳍征。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一面徽、第九天 我趴在偏房一處隱蔽的房頂上張望艳丛。 院中可真熱鬧,春花似錦趟紊、人聲如沸氮双。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戴差。三九已至,卻和暖如春铛嘱,著一層夾襖步出監(jiān)牢的瞬間造挽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工弄痹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饭入,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓肛真,卻偏偏與公主長得像谐丢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蚓让,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

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

  • 1.數(shù)據(jù)持久化 程序中默認(rèn)產(chǎn)生的數(shù)據(jù)是保存在內(nèi)存中的乾忱,程序結(jié)束數(shù)據(jù)會自動(dòng)銷毀。如果希望程序結(jié)束后數(shù)據(jù)不消失历极,那么需...
    筱哥家的小跟班閱讀 243評論 0 0
  • 一窄瘟、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評論 0 10
  • 1.復(fù)習(xí) 1.1:容器類型:字典、列表趟卸、元祖和集合 1.1.1列表(list) a.有序:(可以通過下標(biāo)取獲取元素...
    不忘初心_c590閱讀 84評論 0 0
  • 復(fù)習(xí)回顧:1.遞歸函數(shù)(了解)a.找臨界值b.找關(guān)系(f(n)和f(n-1))c.用f(n-1)實(shí)現(xiàn)f(n) 能用...
    圣咸魚閱讀 470評論 0 0
  • 1.recode 1.1.生成式(生成式的結(jié)果就是一個(gè)生成器) 1.2.模塊和包模塊:一個(gè)py文件就是一個(gè)模塊包:...
    未醒的夢_19b0閱讀 120評論 0 0