1. 程式人生 > >三元運算、文件操作

三元運算、文件操作

賦值 轉換 pri 兩個文件 沒有 三元運算 創建文件 txt buffer

三元運算:

三元運算又稱三目運算,是對簡單的條件語句的簡寫。如:

簡單條件語句:

if 條件成立:

val = 1

else:

val = 2

變成三元運算是:

val = 1 if 條件成立 else 2

文件操作:

文件操作包括讀、寫、修改。

讀:

f = open( file = ‘ F: /工作日常/文件名.txt‘ , mode = ‘r‘, encoding = ‘utf-8‘) # ‘r‘ 表示以(文本)讀的模式打開文件(只能把文本轉化成字符串), encoding= 的作用是: 以什麽格式儲存的文件, 就讓Python以什麽格式打開。如果不指定,Python就按默認的格式打開,Python3默認的是utf-8。 # 讀取出來的內容是字符串格式。

data = f.read() #讀取文件並賦值 # f.read()是讀取所有內容

f.close()

註:數據在硬盤上是以二進制的模式儲存

f.read(1) #讀取一個字符

二進制讀:

f = open( file = ‘ F: /工作日常/文件名.txt‘ , mode = ‘rb‘) # ‘rb‘ 的意思是二進制讀的模式, 把要讀的內容不需要轉碼,直接以二進制的形式讀到內存裏(就是硬盤怎麽存的就怎麽拿出來)。兩種情況需要這種讀取模式:1. 不知道它是什麽編碼格式 2. 用於讀取視頻、圖片、網絡文件傳輸的文本。

檢測編碼工具: chardet

import chardet

f= open(‘文件名‘, ‘rb‘)

data = f.read()

print( chardet.detect(data))

循環讀取文件:

f = open( ‘文件‘ , ‘r‘, encoding = ‘gbk‘)

for line in f: #語法 # 就是一次取一行

print(line) # 文件中沒有空行,但利用循環打印出的結果每行之間都有空行,原因:文本中每行結束有個換行符\n,並且 print()裏面也默認有一個換行符,每打印完一次都會換行。

f.close()

寫:

f = open( file = ‘d:/工作日常/文件名.txt‘ , mode=‘w‘, encoding=‘gbk‘) # ‘w’表示創建一個文件,encoding=‘gbk‘ 表示將要寫入的Unicode字符串編碼成gbk的格式創建並保存

f.write(‘ 內容 ‘) # 表示寫入內容,寫入的內容傳入的時候是Unicode字符串類型,內部會根據encoding自動轉換成指定編碼的010101010101(即:字節類型)

f.close()

註: 用這種模式也可以直接創建一個文件,文件名就是你在open()中命名的“文件名.txt”。

二進制寫:

f= open( file = ‘d:/工作日常/文件名.txt‘ , mode=‘wb‘) #‘wb‘ 表示只以2進制模式寫

f.write(‘內容‘ .encode(‘gbk‘)) # .encode(‘gbk‘) 表示寫入時需要直接傳入何種格式的編碼(如‘gbk’),如果不寫默認的是‘utf-8’

f.close()

註:

1. 文件操作時,以 “w”或“wb” 模式打開,則只能寫,並且在打開的同時先將內容清空;(原先的內容在open的那一步就被清空了)

2. 寫入到硬盤上時:

  • wb,寫入時需要直接傳入以某種編碼的0100101,即:字節類型
  • w 和 encoding,寫入時需要傳入unicode字符串,內部會根據encoding制定的編碼將unicode字符串轉換為該編碼的 010101010

追加:

f = open( file = ‘d:/工作日常/文件名.txt‘ , mode=‘a‘, encoding=‘gbk‘)

f.write(‘ 內容 ‘)

f.close()

二進制追加:

f= open( file = ‘d:/工作日常/文件名.txt‘ , mode=‘ab‘)

f.write(‘內容‘ .encode(‘gbk‘))

f.close()

讀寫:

f = open( file = ‘ F: /工作日常/文件名.txt‘ , mode = ‘r+‘, encoding = ‘utf-8‘)

data = f.read()

f.close()

註:1. read的時候在文件最前面有個小光標,read完或者write完之後會小光標會向後移動,最次read的時候光標只會往後面走,不會再read以前已經read過或者write過的內容。

2. 這種模式也能直接創建文件。 但是,‘r’ 模式的創建不了。

文件操作其他功能:

fileno() #返回文件句柄在內核中的索引值,以後做IO多路復用時可以用到(網絡編程)

flush() # 把文件從內存buffer(緩存)裏強制刷新到硬盤

readline() #只讀一行,遇到\r 或者 \n為止 #讀取出來的內容是字符串格式

f.tell() #返回當前文件光標的位置 # 返回的是字節所在位置

f.seek(數字) # 把操作文件的光標移到指定位置 # 註意seek的長度是按字節算的, 不同字符編碼存每個字符所占的字節長度不一樣。

f.truncate() # 從光標當前位置往後截斷,只保留前面的內容。 也是按字節去截斷。truncate()裏面要是有數字,就是從頭開始截多少個字節留下來。 #不能是‘r’模式

修改:

f = open(‘文件名.txt‘, ‘r+‘, encoding= ‘utf-8‘)

f.seek(數字)

f. write(‘ 你好‘) #插入後就把原先的內容覆蓋了

f.close

覆蓋原因:

技術分享圖片

註: 出於以上的原因,文件不要在硬盤上修改,但可以把內容全部讀到內存裏,數據在內存裏是可以隨便增刪改查的,修改之後,把內容再全部寫回硬盤,把原來的數據全部覆蓋掉。vim Word等各種文本編輯器的工作原理就是這樣的。

文件修改示例:

思路: 把要修改的文件中的內容逐行讀取到內存就行修改,優點: 省內存, 缺點:需要再創建一個文件,多占了硬盤。

f_name = 文件操作測試.txt
f_new_name = 文件操作測試.txt.new   #創建一個新的文件名

old_str = 狗猴
new_str = 廖小偉  #用於修改、替換的內容

f = open(f_name,r,encoding=utf-8)
f_new = open(f_new_name,w,encoding=utf-8)   #把這兩個文件都打開

for line in f:  #一行一行循環讀取老文件中的信息到內存
    if old_str in line:  #判斷讀取到內存的那行內容裏面 有沒有要替換的
        line = line.replace(old_str,new_str)    # 內容(字符串的格式)替換
    f_new.write(line)  # 替換的內容寫到新文件中
f.close()
f_new.close()  # 關閉兩個文件夾

註:待解決: import os
os.rename(f_new_name,f_name)會出錯

三元運算、文件操作