三元運(yùn)算符又稱三目運(yùn)算,是對簡單的條件語句的簡寫
語法:val =1 if 條件成立 else 2創(chuàng)新互聯(lián)建站公司2013年成立,先為象山等服務(wù)建站,象山等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為象山企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
簡單條件語句:
a = 0
if a == 0:
val = 0
else:
val = 1
print(val)
三目運(yùn)算:
val = 0 if a == 0 else 2
print(val)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
0
0
Process finished with exit code 0
錯誤案例
a = 0
val = 0 if a == 0 else val = 2
print(val)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
File "E:/PythonProject/python-test/BasicGrammer/test.py", line 8
val = 0 if a == 0 else val = 2
^
SyntaxError: can't assign to conditional expression
Process finished with exit code 1
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="讀文件.txt", mode="r", encoding="utf-8")
data = f.read()
f.close()
print(type(data))
print(data)
# file="讀文件.txt" 表示文件路徑
# mode="r" 表示"只讀"(可以修改為其他)
# encoding="utf-8" 表示將硬盤上的0101010101按照utf-8的規(guī)則去"斷句",再將"斷句"后的每一段01010101轉(zhuǎn)換成unicode的0101010,unicode對照表中有010101和字符的對應(yīng)關(guān)系
# f.read()表示讀取多有內(nèi)容,內(nèi)容是已經(jīng)轉(zhuǎn)換完成的"字符串"
# f.close() 表示關(guān)閉文件
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
哈哈
Process finished with exit code 0
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="讀文件.txt", mode="rb")
data = f.read()
f.close()
print(type(data))
print(data)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
b'\xe5\x93\x88\xe5\x93\x88\r\n'
Process finished with exit code 0
# mode="rb" 表示只讀(可以修改為其他)
# 數(shù)據(jù)類型是"bytes"
# rb 與 r 的區(qū)別:
# "rb"在打開文件的時候不需要指定encoding,因為直接以rb模式打開文件
# rb是二進(jìn)制模式,數(shù)據(jù)讀到內(nèi)存中直接就是bytes模式,如果想要看內(nèi)容,還需要手動decode
# 因此文件打開階段不要指定編碼
# 手動decode也需要知道源文件的編碼,否則,decode后還是亂碼的
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
import chardet
result = chardet.detect(open(file="讀文件.txt", mode="rb").read())
print(result)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
{'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}
Process finished with exit code 0
# 查看到源文件編碼是utf-8,下面就使用utf-8解碼
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
data = open(file="讀文件.txt", mode="rb").read()
print(data.decode(encoding="utf-8"))
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
哈哈
Process finished with exit code 0
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="讀文件.txt", mode="r", encoding='utf-8')
print("--------readline-------")
print(f.readline())
print(f.readline())
print(type(f.readline()))
# readline讀取一行,這一行的數(shù)據(jù)類型是str
print("--------readline-------")
print("--------readlines-------")
print(f.readlines())
print(type(f.readlines()))
# readlines是全部讀取出來,數(shù)據(jù)類型是list
print("--------readlines-------")
print("--------read-------")
print(f.read())
print(type(f.read()))
# read是全部讀取出來,數(shù)據(jù)類型是str
# 這里為空,是因為上面的代碼已經(jīng)把文件讀取完了
print("--------read-------")
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
--------readline-------
馬纖羽 北京 173 50 13744234523
喬亦菲 廣州 172 52 15823423525
--------readline-------
--------readlines-------
['劉諾涵 \t北京\t170\t48\t18623423765\n', '岳妮妮 \t北京\t177\t54\t18835324553\n', '賀婉萱 \t北京\t174\t52\t18933434452\n', '葉梓萱\t上海\t171\t49\t18042432324\n', '杜姍姍 北京 167 49 13324523342\n', 'black girl 河北 167 50 13542342233']
--------readlines-------
--------read-------
--------read-------
Process finished with exit code 0
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="讀文件.txt", mode="r", encoding='utf-8')
for line in f:
print(line)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
馬纖羽 北京 173 50 13744234523
喬亦菲 廣州 172 52 15823423525
羅夢竹 北京 175 49 18623423421
劉諾涵 北京 170 48 18623423765
岳妮妮 北京 177 54 18835324553
賀婉萱 北京 174 52 18933434452
葉梓萱 上海 171 49 18042432324
杜姍姍 北京 167 49 13324523342
black girl 河北 167 50 13542342233
Process finished with exit code 0
# read()方法讀取文件,是一下子把整個文件都讀取到內(nèi)存中,一次性讀完,但是如果文件很大,會出現(xiàn)內(nèi)存溢出的情況,所以可以每次讀取部分?jǐn)?shù)據(jù)
# 為什么每行的后面都有一個空行呢?
# 因為print()函數(shù)就是自動會換行,而且每行的后面已經(jīng)存在\n了,所以會有個空行
# 上面使用readlins()函數(shù)時,可以看到每行結(jié)尾都是有\(zhòng)n的
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="寫文件.txt", mode="w", encoding='utf-8')
# "這時文件還沒真正寫入硬盤中,還在內(nèi)存中,可以f.write()后調(diào)用f.flush()把內(nèi)容寫入到硬盤中,防止數(shù)據(jù)丟失"
f.write('寫入文件')
# "這時文件才寫入硬盤"
f.close()
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
Process finished with exit code 0
查看文件內(nèi)容
寫入文件
# mode = "w" 表示只寫,"w"是創(chuàng)建模式,會清空之前的內(nèi)容,重新寫入,比較危險
# encoding='utf-8' 將要寫入的unicode字符串編碼成utf-8格式
# f.write() 表示寫入內(nèi)容,寫入的內(nèi)容是unicode字符串類型,內(nèi)部會根據(jù)encoding轉(zhuǎn)換成特定編碼的01010101,即字節(jié)類型
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="寫文件.txt", mode="wb")
f.write('寫入文件'.encode("utf-8"))
f.close()
# "寫入文件的時候,需要手動把寫入的內(nèi)容encode(),指定編碼"
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
Process finished with exit code 0
查看文件內(nèi)容
寫入文件
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="寫文件.txt", mode="a",encoding="utf-8")
f.write("追加寫入文件")
f.write("\n追加寫入文件\n追加換行")
f.close()
# mode = a或ab模式打開,只能追加,即:在原來內(nèi)容的尾部追加內(nèi)容
# a追加時,需要指定編碼。ab追加時,需要手動設(shè)定編碼
"a和ab默認(rèn)都是在本行內(nèi)追加,要想換行,需要手動追加\n"
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
Process finished with exit code 0
查看文件內(nèi)容
寫入文件追加寫入文件
追加寫入文件
追加換行
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="寫文件.txt", mode="ab")
f.write("追加寫入文件ab".encode("utf-8"))
f.write("\n追加寫入文件ab\n追加換行ab".encode("utf-8"))
f.close()
# mode = a或ab模式打開,只能追加,即:在原來內(nèi)容的尾部追加內(nèi)容
# a追加時,需要指定編碼。ab追加時,需要手動設(shè)定編碼
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
Process finished with exit code 0
查看文件內(nèi)容
寫入文件追加寫入文件
追加寫入文件
追加換行追加寫入文件ab
追加寫入文件ab
追加換行ab
查看源文件內(nèi)容
追加換行追加寫入文件ab
追加寫入文件ab
追加換行ab
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="寫文件.txt", mode="r+", encoding="utf-8")
f.write("\nr+寫入文件")
f.close()
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
Process finished with exit code 0
運(yùn)行后查看文件中內(nèi)容
"1.r+寫入時,默認(rèn)是寫入到文件的開頭位置"
"2.由于中文在utf-8編碼時,是每個字占用3個字節(jié),英文和+是占一個字節(jié)共占用2個字節(jié),由于write()時是覆蓋原位置的內(nèi)容,出現(xiàn)字節(jié)數(shù)不匹配,就出現(xiàn)了亂碼"
"下面我們繼續(xù)實驗剛好追加相同字節(jié)數(shù)的內(nèi)容"
查看源文件內(nèi)容
追加換行追加寫入文件ab
追加寫入文件ab
追加換行ab
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="寫文件.txt", mode="r+", encoding="utf-8")
f.write("r++寫入文件")
f.close()
運(yùn)行后查看文件內(nèi)容
r++寫入文件加寫入文件ab
追加寫入文件ab
追加換行ab
這次就沒有出現(xiàn)亂碼
"先read,再write"
查看源文件內(nèi)容
加寫入文件ab
追加寫入文件ab
追加換行ab
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="寫文件.txt", mode="r+", encoding="utf-8")
print(f.read())
f.write("\nr++寫入文件")
print(f.read())
# "這一次的read沒有顯示出剛剛追加的內(nèi)容,因為讀取文件的小指針已經(jīng)在文件位置了,寫入文件也會移動指針"
f.close()
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
加寫入文件ab
追加寫入文件ab
追加換行ab
Process finished with exit code 0
查看文件中內(nèi)容
加寫入文件ab
追加寫入文件ab
追加換行ab
r++寫入文件
"以寫的模式打開,然后可以讀。所以會覆蓋舊的內(nèi)容,同樣是危險的"
查看文件中內(nèi)容
加寫入文件ab
追加寫入文件ab
追加換行ab
r++寫入文件
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="寫文件.txt", mode="w+", encoding="utf-8")
f.write("w++寫入文件")
print(f.read())
f.close()
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
Process finished with exit code 0
查看文件內(nèi)容
w++寫入文件
@abstractmethod
def fileno(self) -> int:
pass
"返回文件句柄在內(nèi)核中的索引值,以后做IO多路復(fù)用時可以用到"
@abstractmethod
def flush(self) -> None:
pass
"把文件從內(nèi)存buffer里強(qiáng)制刷新到硬盤"
把文件從內(nèi)存buffer里強(qiáng)制刷新到硬盤中
>>> f = open(file="寫文件.txt", mode="w", encoding="UTF-8")
>>> f.write("寫如硬盤flush測試")
12
這是看文件,文件中是空的
>>> f.close()
這時看文件,文件中內(nèi)容
寫如硬盤flush測試
@abstractmethod
def readable(self) -> bool:
pass
"判斷文件是否可讀"
@abstractmethod
def readable(self) -> bool:
pass
"判斷文件是否可讀"
@abstractmethod
def readline(self, limit: int = -1) -> AnyStr:
pass
只讀一行,遇到\r或\n為止
>>> f = open(file="讀文件.txt", mode="r", encoding="UTF-8")
>>> f.readline()
'哈哈\n'
>>> f.readline()
'呵呵\n'
>>> f.readline()
'嗚嗚'
>>> f.readline()
''
>>>
@abstractmethod
def seek(self, offset: int, whence: int = 0) -> int:
pass
@abstractmethod
def tell(self) -> int:
pass
"seek按照字節(jié)讀取,read()按照字符讀取"
"tell返回文件光標(biāo)當(dāng)前所在的位置"
文件中內(nèi)容
哈哈
呵呵
嗚嗚
>>> f = open(file="讀文件.txt", mode="r", encoding="UTF-8")
>>> f.tell()
0
>>> f.seek(3)
3
>>> f.readline()
'哈\n'
>>> f.tell()
8
>>> f.seek(10)
10
>>> f.readlilne()
Traceback (most recent call last):
File "", line 1, in
AttributeError: '_io.TextIOWrapper' object has no attribute 'readlilne'
>>> f.seek(11)
11
>>> f.readline()
'呵\n'
>>> f.tell()
16
>>>
>>> f.read(1) --read按照字符讀取
'嗚'
>>> f.tell() --seek和tell是按照字節(jié)讀取
19
@abstractmethod
def seekable(self) -> bool:
pass
"判斷文件是否能進(jìn)行seek操作"
@abstractmethod
def writable(self) -> bool:
pass
判斷文件是否可寫入
@abstractmethod
def truncate(self, size: int = None) -> int:
pass
"按照指定長度截斷文件,不管當(dāng)前位置在哪,都是留取從頭開始的指定長度的內(nèi)容"
"指定長度的話,就從文件開頭開始截斷指定長度,不指定長度的話,就從當(dāng)前位置到文件尾部的內(nèi)容全去掉"
文件中內(nèi)容
你好中國
>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.truncate()
0
查看文件內(nèi)容,文件為空
>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.truncate(3) --指定位置,這里面的3,意思是不管你在哪里,都是從頭開始,保留3個字節(jié),下面兩個實驗驗證
3
>>> f.read() --查看只留下了一個字,其余的都刪除了
'你'
驗證一:
>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.seek(3)
3
>>> f.truncate(6) --這里是從頭開始,保留6個字節(jié),所以文件中的內(nèi)容最后為你好
6
>>> f.read()
'好'
>>>
查看文件內(nèi)容
你好
驗證二:
>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.seek(6) --當(dāng)前位置在第六字節(jié)處
6
>>> f.truncate(3) --截取從頭開始,到第三字節(jié)處,所以文件中只剩下你
3
>>> f.read()
''
查看文件內(nèi)容
你
嘗試直接以r+模式打開文件,默認(rèn)會把新增的內(nèi)容追加到文件最后面。但是如果想要修改中間的內(nèi)容,怎樣操作呢?
我們已經(jīng)學(xué)了seek,之所以會把內(nèi)容追加到最后面,是因為文件一打開,要寫的時候,光標(biāo)會默認(rèn)移到文件的尾部,再開始寫?,F(xiàn)在如果想要修改中間的內(nèi)容,是不是seek()到相應(yīng)的位置,然后再寫入即可呢?
下面進(jìn)行操作
文件中原內(nèi)容
你好中國
>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.seek(6)
6
>>> f.write("嗎")
1
>>> f.flush()
查看文件內(nèi)容
你好嗎國 --這里中被替換為了嗎,并不是在"中"前面插入一個"嗎",而是覆蓋那個位置的內(nèi)容
繼續(xù)實驗
>>> f.seek(3)
3
>>> f.write("nihao嗎") --含有中文和英文,插入5個英文字符,占用5個字節(jié),"嗎"在UTF-8編碼時占用3個字節(jié),總共占用8個字節(jié),由于源文件中全是中文,需要是3的倍數(shù)才不會亂碼,這里占用8個字節(jié)就會亂碼
6
>>> f.flush()
查看文件內(nèi)容
你nihao嗎?
重新實驗,驗證
文件中原內(nèi)容
你好中國
>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.seek(3)
3
>>> f.write("kkk嗎") --這里英文和中文占用6個字節(jié),剛好是原文件中的兩個中文,所以沒有亂碼
4
>>> f.flush()
查看文件內(nèi)容
你kkk嗎國
"所以如果插入的內(nèi)容和源文件中的相同位置的字節(jié)數(shù)相匹配,就不會亂碼。但這種文件修改方式是覆蓋原文件中相同位置處的內(nèi)容,而不是插入內(nèi)容"
要想實現(xiàn)在文件中間插入內(nèi)容,有下面兩種方式:
"文件內(nèi)容替換,占用硬盤方式"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
# 占用硬盤的方式:即新建一個文件
source_file = "寫文件.txt"
tmp_file = "寫文件.txt.tmp"
s_f = open(file=source_file, mode="r", encoding="UTF-8")
t_f = open(file=tmp_file, mode="w", encoding="UTF-8")
for line in s_f:
if "深圳" in line:
line = line.replace("深圳", "北京")
t_f.write(line)
s_f.close()
t_f.close()
查看寫文件.txt.tmp內(nèi)容
馬纖羽 北京 173 50 13744234523
喬亦菲 廣州 172 52 15823423525
羅夢竹 北京 175 49 18623423421
劉諾涵 北京 170 48 18623423765
岳妮妮 北京 177 54 18835324553
賀婉萱 北京 174 52 18933434452
葉梓萱 上海 171 49 18042432324
杜姍姍 北京 167 49 13324523342
black girl 河北 167 50 13542342233
"占用內(nèi)存的方式"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
# 占用硬盤的方式:即新建一個文件
source_file = "寫文件.txt"
s_f = open(file=source_file, mode="r+", encoding="UTF-8")
data = s_f.read()
data = data.replace("深圳", "北京")
s_f.seek(0)
s_f.truncate()
s_f.write(data)
s_f.close()
查看寫文件.txt
馬纖羽 北京 173 50 13744234523
喬亦菲 廣州 172 52 15823423525
羅夢竹 北京 175 49 18623423421
劉諾涵 北京 170 48 18623423765
岳妮妮 北京 177 54 18835324553
賀婉萱 北京 174 52 18933434452
葉梓萱 上海 171 49 18042432324
杜姍姍 北京 167 49 13324523342
black girl 河北 167 50 13542342233