三元運算符

1.三元運算符

1.1介紹

三元運算符又稱三目運算,是對簡單的條件語句的簡寫
語法:val =1 if 條件成立 else 2

簡單條件語句:
a = 0
if a == 0:
    val = 0
else:
    val = 1
print(val)

三目運算:
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

2.文件處理

2.1文件讀r

#!/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的規則去"斷句",再將"斷句"後的每一段01010101轉換成unicode的0101010,unicode對照表中有010101和字符的對應關係
# f.read()表示讀取多有內容,內容是已經轉換完成的"字符串"
# f.close() 表示關閉文件

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
<class 'str'>
哈哈

Process finished with exit code 0

三元運算符

2.2文件讀rb

#!/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
<class 'bytes'>
b'\xe5\x93\x88\xe5\x93\x88\r\n'

Process finished with exit code 0

# mode="rb" 表示只讀(可以修改爲其他)
# 數據類型是"bytes"
# rb 與 r 的區別:
# "rb"在打開文件的時候不需要指定encoding,因爲直接以rb模式打開文件
# rb是二進制模式,數據讀到內存中直接就是bytes模式,如果想要看內容,還需要手動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

2.3read(),readline(),readlines()

#!/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讀取一行,這一行的數據類型是str
print("--------readline-------")

print("--------readlines-------")
print(f.readlines())
print(type(f.readlines()))
# readlines是全部讀取出來,數據類型是list
print("--------readlines-------")

print("--------read-------")
print(f.read())
print(type(f.read()))
# read是全部讀取出來,數據類型是str
# 這裏爲空,是因爲上面的代碼已經把文件讀取完了
print("--------read-------")

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
--------readline-------
馬纖羽     北京  173 50  13744234523

喬亦菲  廣州 172 52  15823423525

<class 'str'>
--------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']
<class 'list'>
--------readlines-------
--------read-------

<class 'str'>
--------read-------

Process finished with exit code 0

2.4循環讀取文件

#!/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()方法讀取文件,是一下子把整個文件都讀取到內存中,一次性讀完,但是如果文件很大,會出現內存溢出的情況,所以可以每次讀取部分數據
# 爲什麼每行的後面都有一個空行呢?
# 因爲print()函數就是自動會換行,而且每行的後面已經存在\n了,所以會有個空行
# 上面使用readlins()函數時,可以看到每行結尾都是有\n的

2.5寫文件w

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="寫文件.txt", mode="w", encoding='utf-8')
 # "這時文件還沒真正寫入硬盤中,還在內存中,可以f.write()後調用f.flush()把內容寫入到硬盤中,防止數據丟失"
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

查看文件內容
寫入文件

# mode = "w" 表示只寫,"w"是創建模式,會清空之前的內容,重新寫入,比較危險
# encoding='utf-8' 將要寫入的unicode字符串編碼成utf-8格式
# f.write() 表示寫入內容,寫入的內容是unicode字符串類型,內部會根據encoding轉換成特定編碼的01010101,即字節類型

2.6wb

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
f = open(file="寫文件.txt", mode="wb")
f.write('寫入文件'.encode("utf-8"))
f.close()

# "寫入文件的時候,需要手動把寫入的內容encode(),指定編碼"

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py

Process finished with exit code 0

查看文件內容
寫入文件

2.7追加a

#!/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模式打開,只能追加,即:在原來內容的尾部追加內容
# a追加時,需要指定編碼。ab追加時,需要手動設定編碼

"a和ab默認都是在本行內追加,要想換行,需要手動追加\n"
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py

Process finished with exit code 0
查看文件內容
寫入文件追加寫入文件
追加寫入文件
追加換行

2.8追加ab

#!/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模式打開,只能追加,即:在原來內容的尾部追加內容
# a追加時,需要指定編碼。ab追加時,需要手動設定編碼

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py

Process finished with exit code 0
查看文件內容
寫入文件追加寫入文件
追加寫入文件
追加換行追加寫入文件ab
追加寫入文件ab
追加換行ab

2.9 讀寫r+

查看源文件內容
追加換行追加寫入文件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
運行後查看文件中內容
"1.r+寫入時,默認是寫入到文件的開頭位置"
"2.由於中文在utf-8編碼時,是每個字佔用3個字節,英文和+是佔一個字節共佔用2個字節,由於write()時是覆蓋原位置的內容,出現字節數不匹配,就出現了亂碼"

三元運算符

"下面我們繼續實驗剛好追加相同字節數的內容"
查看源文件內容
追加換行追加寫入文件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()
運行後查看文件內容
r++寫入文件加寫入文件ab
追加寫入文件ab
追加換行ab
這次就沒有出現亂碼

"先read,再write"
查看源文件內容
加寫入文件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沒有顯示出剛剛追加的內容,因爲讀取文件的小指針已經在文件位置了,寫入文件也會移動指針"
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

查看文件中內容
加寫入文件ab
追加寫入文件ab
追加換行ab

r++寫入文件

2.10寫讀 w+

"以寫的模式打開,然後可以讀。所以會覆蓋舊的內容,同樣是危險的"
查看文件中內容
加寫入文件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
查看文件內容
w++寫入文件

2.11文件操作的其他功能

    @abstractmethod
    def fileno(self) -> int:
        pass
"返回文件句柄在內核中的索引值,以後做IO多路複用時可以用到"
    @abstractmethod
    def flush(self) -> None:
        pass
"把文件從內存buffer裏強制刷新到硬盤"
把文件從內存buffer裏強制刷新到硬盤中
>>> f = open(file="寫文件.txt", mode="w", encoding="UTF-8")
>>> f.write("寫如硬盤flush測試")
12
這是看文件,文件中是空的
>>> f.close()
這時看文件,文件中內容
寫如硬盤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按照字節讀取,read()按照字符讀取"
"tell返回文件光標當前所在的位置"
文件中內容
哈哈
呵呵
嗚嗚

>>> 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 "<stdin>", line 1, in <module>
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是按照字節讀取
19
   @abstractmethod
    def seekable(self) -> bool:
        pass
"判斷文件是否能進行seek操作"
    @abstractmethod
    def writable(self) -> bool:
        pass
判斷文件是否可寫入
    @abstractmethod
    def truncate(self, size: int = None) -> int:
        pass
"按照指定長度截斷文件,不管當前位置在哪,都是留取從頭開始的指定長度的內容"
"指定長度的話,就從文件開頭開始截斷指定長度,不指定長度的話,就從當前位置到文件尾部的內容全去掉"
文件中內容
你好中國

>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.truncate()
0
查看文件內容,文件爲空

>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.truncate(3)  --指定位置,這裏面的3,意思是不管你在哪裏,都是從頭開始,保留3個字節,下面兩個實驗驗證
3
>>> f.read()  --查看只留下了一個字,其餘的都刪除了
'你'

驗證一:
>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.seek(3)
3
>>> f.truncate(6)  --這裏是從頭開始,保留6個字節,所以文件中的內容最後爲你好
6
>>> f.read()
'好'
>>>
查看文件內容
你好

驗證二:
>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.seek(6)  --當前位置在第六字節處
6
>>> f.truncate(3)  --截取從頭開始,到第三字節處,所以文件中只剩下你
3
>>> f.read()
''
查看文件內容
你

2.12文件修改

嘗試直接以r+模式打開文件,默認會把新增的內容追加到文件最後面。但是如果想要修改中間的內容,怎樣操作呢?
我們已經學了seek,之所以會把內容追加到最後面,是因爲文件一打開,要寫的時候,光標會默認移到文件的尾部,再開始寫。現在如果想要修改中間的內容,是不是seek()到相應的位置,然後再寫入即可呢?

下面進行操作
文件中原內容
你好中國

>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.seek(6)
6
>>> f.write("嗎")
1
>>> f.flush()
查看文件內容
你好嗎國  --這裏中被替換爲了嗎,並不是在"中"前面插入一個"嗎",而是覆蓋那個位置的內容

繼續實驗
>>> f.seek(3)
3
>>> f.write("nihao嗎")  --含有中文和英文,插入5個英文字符,佔用5個字節,"嗎"在UTF-8編碼時佔用3個字節,總共佔用8個字節,由於源文件中全是中文,需要是3的倍數纔不會亂碼,這裏佔用8個字節就會亂碼
6
>>> f.flush()
查看文件內容
你nihao嗎�

重新實驗,驗證
文件中原內容
你好中國

>>> f = open(file="讀文件.txt", mode="r+", encoding="UTF-8")
>>> f.seek(3)
3
>>> f.write("kkk嗎")  --這裏英文和中文佔用6個字節,剛好是原文件中的兩個中文,所以沒有亂碼
4
>>> f.flush()

查看文件內容
你kkk嗎國

"所以如果插入的內容和源文件中的相同位置的字節數相匹配,就不會亂碼。但這種文件修改方式是覆蓋原文件中相同位置處的內容,而不是插入內容"
要想實現在文件中間插入內容,有下面兩種方式:
"文件內容替換,佔用硬盤方式"
#!/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內容
馬纖羽     北京 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
"佔用內存的方式"
#!/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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章