day12、文件操作 2019-01-08

一、復(fù)習(xí)

1.遞歸函數(shù)(了解)

a.找臨界值
b.找關(guān)系( f(n) 和 f(n-1) )
c.用 f(n-1) 實(shí)現(xiàn) f(n)

(能使用循環(huán)就不使用遞歸;因?yàn)檫f歸性能低,會(huì)消耗大量內(nèi)存和 cpu 資源)

2.模塊

模塊就是 py 文件

import 模塊
from 模塊 import 內(nèi)容

import 模塊 as ...
from 模塊 import 內(nèi)容 as ...

3.迭代器和生成器

迭代器: iter ;將其他序列轉(zhuǎn)換成迭代器;
取元素: next() , for-in;

生成器:調(diào)用一個(gè)帶有 yield 關(guān)鍵字的函數(shù)。
例如:

if __name__ == '__main__':
    # 寫在這個(gè)函數(shù)里面的內(nèi)容不會(huì)被導(dǎo)入
    pass


def func1():
    for i in range(10):
        yield i


print(next(func1()))              # 結(jié)果為:0
print(next(func1()))              # 結(jié)果為:0

num1 = func1()
print(next(num1))           # 結(jié)果為:0
print(next(num1))           # 結(jié)果為:1

運(yùn)行效果:

0
0
0
1

二、生成式

1.什么是生成式

生成式就是生成器的一種特殊寫法(固定寫法)

2.寫法

a.

生成器 = (表達(dá)式 for 變量 in 序列)
功能:讓變量去序列中取值,每取一個(gè)值就將對(duì)應(yīng)表達(dá)式的值作為生成器的元素返回一次。
def 函數(shù)名():
for 變量 in 序列:
yield 表達(dá)式

b.

生成器 = (表達(dá)式 for 變量 in 序列 if 條件語句)
def 函數(shù)名():
for 變量 in 序列:
if 條件語句:
yield 表達(dá)式
例如:

gen1 = (i * 2 for i in range(5))
print(gen1)
print(next(gen1))           # 結(jié)果為:0
print(next(gen1))           # 結(jié)果為:2
print(next(gen1))           # 結(jié)果為:4


def func1():
    """這個(gè)是生成式展開成生成器的寫法"""
    for i in 'adc':
        yield i * 2


gen2 = ((value, key) for key, value in {'name': '小明', 'age': 20, 'tel': 666666}.items())
print(next(gen2))           # 結(jié)果為:('小明', 'name')
print(next(gen2))           # 結(jié)果為:(20, 'age')


def func2():
    """這個(gè)是生成式展開成生成器的寫法"""
    for key, value in {'name': '小明', 'age': 20}.items():
        yield value, key

運(yùn)行效果:

0
2
4
('小明', 'name')
(20, 'age')

3.將迭代器、生成器轉(zhuǎn)換成其它序列

例如:

list1 = list(gen2)      # 轉(zhuǎn)換后,生成器里面就沒有元素了
print(list1)            # 結(jié)果為:[(666666, 'tel')]
# print(list1)            # 報(bào)錯(cuò)。(stopiteration)

# [生成式]         -----直接將生成式對(duì)應(yīng)的生成器轉(zhuǎn)換成列表
list2 = [(value, key) for key, value in {'name': '小明', 'age': 20, 'tel': 666666}.items()]
print(list2)

# 練習(xí):交換字典中的 key 和 value 的值
dict1 = {'a': 1, 'd': 1, 'c': 2}
result = dict((x, y) for y, x in dict1.items())
print(result)

運(yùn)行效果:

[(666666, 'tel')]
[('小明', 'name'), (20, 'age'), (666666, 'tel')]
{1: 'd', 2: 'c'}

三、文件操作

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

將數(shù)據(jù)以文件的形式存到計(jì)算機(jī)硬盤中(程序中保存的數(shù)據(jù),當(dāng)程序結(jié)束時(shí)會(huì)自動(dòng)銷毀)

2.怎么做數(shù)據(jù)持久化(怎么將程序中的數(shù)據(jù)和本地文件中的數(shù)據(jù)關(guān)聯(lián))

文件讀(獲取文件中的內(nèi)容)寫(將數(shù)據(jù)添加到文件中)操作:

a.文件操作的流程為(文件操作不關(guān)乎語言):打開文件 --> 文件操作(讀/寫) --> 關(guān)閉文件

3.打開文件

open(file, mode = 'r', encoding = None) -----以指定的模式打開指定的文件,并返回被打開的文件對(duì)象
說明:
file: -----格式是字符串,需要打開的文件的路徑。
絕對(duì)路徑(了解):就是文件在電腦上的完全路徑。
相對(duì)路徑:相對(duì)當(dāng)前代碼文件對(duì)應(yīng)的目錄來確定路徑(
' 紫極天下.txt '
'./紫極天下.txt '
'../紫極天下.txt ' -----打開當(dāng)前目錄的上層目錄)。
mode: -----格式是字符串,文件的打開方式。
'r' --> 以只讀的形式打開 (默認(rèn))
'rb/br' --> 以只讀的形式打開,二進(jìn)制
'w' --> 以只寫的方式打開(會(huì)覆蓋)
'a' --> 以只寫的方式打開(打開在寫的時(shí)候?yàn)?覆蓋 )
'wb/bw' --> 以只寫的形式打開,二進(jìn)制
'+' --> 以讀、寫的方式打開
注意:當(dāng)以讀的方式打開一個(gè)不存在的文件,程序報(bào)錯(cuò);
當(dāng)以寫的方式打開一個(gè)不存在的文件,不會(huì)報(bào)錯(cuò),并且自動(dòng)創(chuàng)建這個(gè)文件。
encoding: -----格式是字符串,文件的編碼方式。
utf-8:支持所有的語言
gbk:只支持英語
注意:a.讀和寫時(shí)對(duì)應(yīng)的文字編碼方式,要保持一致。
文件是以什么編碼方式保存,就以什么編碼方式打開,
b.非文本文件不能設(shè)置編碼方式。例如:圖片文件、視頻文件、可執(zhí)行文件等。
c.給它傳值的時(shí)候,要使用關(guān)鍵字參數(shù)。
d.以二進(jìn)制形式打開文件時(shí),不能設(shè)置 encoding 。

一、打開文件:

a.打開文件,文件路徑為絕對(duì)路徑:
例如:


# open('C:\Users\Administrator\PycharmProjects\untitled1\day12.file 1.8\紫極天下.txt')
# b.打開當(dāng)前目錄下的文件:

open('紫極天下.txt')
open('./紫極天下.txt')          # 與上面的語句作用一樣。

打開當(dāng)前目錄下的子目錄里面的文件: '子目錄/文件名' or './子目錄/文件名'
open('files/test.txt')
open('./files/test.txt') # 與上面的語句作用一樣。
open('././code/hhh.txt') # 打開當(dāng)前目錄的上層目錄里的文件。

二、打開方式:

例如:

txt1 = open('././code/hhh.txt', 'r', encoding='utf-8')
f = txt1.read()
f1 = txt1.readline()
print(f)

運(yùn)行效果:

1
2
3
4

4.操作文件

a.讀操作:
文件對(duì)象.read() -----讀整個(gè)文件的內(nèi)容
文件對(duì)象.readline() -----讀文件的一行內(nèi)容

5.關(guān)閉文件

文件對(duì)象.close()

6.文件操作的簡寫

with open(f1, mode, encoding) as 文件對(duì)象
文件操作代碼

練習(xí):讀文件中 的內(nèi)容,一行一行的讀,讀完為止

while True:
    f1 = txt1.readline()
    print(f)
    if not f1:
        break

運(yùn)行效果:

1
2
3
4

如果文件進(jìn)行寫操作,那么文件必須以寫的方式打開。
w -----用新的內(nèi)容覆蓋原內(nèi)容
a -----在原文件的末尾添加新的內(nèi)容
例如:

f = open('././code/hhh.txt', 'a', encoding='utf-8')
f.write('halo')
f = open('././code/hhh.txt', 'w', encoding='utf-8')
f.write('hellow')

運(yùn)行效果:

1234halo
hellow

圖片下載過程:請(qǐng)求圖片二進(jìn)制數(shù)據(jù),將二進(jìn)制數(shù)據(jù)寫入本地文件中

import requests
requests = requests.get('網(wǎng)絡(luò)地址')
f = open('圖片名字.jpg', 'wb')

關(guān)閉打開文件

f.close()

練習(xí):用一個(gè)變量來保存當(dāng)前文件執(zhí)行的次數(shù):第一次執(zhí)行 py 文件的時(shí)候打印1,第二次執(zhí)行打印2···
程序中需要這個(gè)數(shù)據(jù)的時(shí)候,就從文件中將這個(gè)數(shù)據(jù)讀出來。
對(duì)數(shù)據(jù)進(jìn)行了修改之后,再把最新的數(shù)據(jù)保存到文件中。

# 讀文件
with open('./code./num.txt', encoding='utf-8') as f:
    num1 = int(f.read())

# 改數(shù)據(jù)
num1 += 1

# 寫入
with open('./code./hhh.txt', 'w', encoding='utf-8') as f:
    f.write(str(num1))

# 顯示數(shù)據(jù)
print(num1)

運(yùn)行效果:

1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容