Python之讀寫文本數據

知識點很少python

一:普通操做 函數

# rt 模式的 open() 函數讀取文本文件
# wt 模式的 open() 函數清除覆蓋掉原文件,write新文件
# at 模式的 open() 函數添加write新文件
with open("../../testData","rt",encoding="utf-8") as f :
    for line in f :
        print(line)


# 寫操做默認使用系統編碼,能夠經過調用 sys.getdefaultencoding() 來獲得,也以經過傳遞一個可選的 encoding 參數給open()函數,幾個常見的編碼是ascii, latin-1, utf-8和utf-16
# 關於換行符的識別問題:在Unix和Windows中是不同的(分別是 \n 和 \r\n )。 默認狀況下,Python會以統一模式處理換行,識別普通換行符並將其轉換爲單個 \n 字符
# 若是你不但願這種默認的處理方式,能夠給 open() 函數傳入參數 newline=''
f =open('somefile.txt', 'rt', newline='')


# 最後一個問題就是文本文件中可能出現的編碼錯誤
# 若是修改了編碼方式以後,編碼錯誤仍是存在的話,你能夠給 open() 函數傳遞一個可選的 errors 參數來處理這些錯誤。
m = open('sample.txt', 'rt', encoding='ascii', errors='replace')

# 若是你常常使用 errors 參數來處理編碼錯誤,也是很差的。
# 原則是確保你老是使用的是正確編碼。當模棱兩可的時候,就使用默認的設置(一般都是UTF-8)。
二:打印輸出至文件中
with open('../../testData', 'at') as f:
    print('Hello python!', file=f)

# 使用其餘分隔符或行終止符打印
# 使用 print() 函數輸出數據,可是想改變默認的分隔符或者行尾符,使用sep  end
print("hello","cool","zzy",sep="***",end="!")   # hello***cool***zzy!

#使用  str.join()
print("***".join(("hello","cool","zzy")))  # hello***cool***zzy

# 對比
row = ("hello","cool","zzy")
print(*row,sep="***")   # hello***cool***zzy
三:讀寫字節數據
# 讀寫二進制文件,好比圖片,聲音文件,使用模式爲 rb 或 wb 的 open() 函數

# 在讀取二進制數據的時候,字節字符串和文本字符串的語義差別可能會致使一個潛在的陷阱:索引和迭代動做返回的是字節的值而不是字節字符串
a='Hello World'
print(a[0])   # H

b = b'Hello World'  # Byte string
print(b[0])  # 72  索引和迭代動做返回的是字節的值而不是字節字符串


# 若是你想從二進制模式的文件中讀取或寫入文本數據,必須確保要進行解碼和編碼操做
# 解碼
with open("../../testDta","rb") as f :
    data=f.read(16)
    text=data.decode("utf-8")

# 編碼
with open("../../testDta","wb") as d :
    text="hello"
    f.write(text.encode("utf-8"))
四:文件不存在才能寫入
一個替代方案是先測試這個文件是否存在,像下面這樣:
import os
if not os.path.exists("../../testData"):
    with open("../../testData", "wt") as f:
        f.write("")
else:
    print('File already exists!')
最優解決
# 文件中寫入數據,不容許覆蓋已存在的數據,能夠用"xt",這個參數會判斷文件是否已經存在(無論是否有內容,也無論內容是怎樣的),若是有會報錯FileExistsError:
with open("../../testData","wt") as f :
    f.write("")
with open("../../testData","xt") as f :
    f.write("你好")    # FileExistsError: [Errno 17] File exists: '../../testData'
五:讀壓縮文件
import gzip
with gzip.open('somefile.gz', 'rt') as f:
    text = f.read()

# bz2 compression
import bz2
with bz2.open('somefile.bz2', 'rt') as f:
    text = f.read()

# 寫入壓縮數據
import gzip
with gzip.open('somefile.gz', 'wt') as f:
    f.write(text)

# bz2 compression
import bz2
with bz2.open('somefile.bz2', 'wt') as f:
    f.write(text)
讀寫壓縮數據  若是你不指定模式,那麼默認的就是二進制模式,若是這時候程序想要接受的是文本數據,那麼就會出錯。
gzip.open() 和 bz2.open() 接受跟內置的 open() 函數同樣的參數, 包括 encoding,errors,newline 等等。
可使用 compresslevel 這個可選的關鍵字參數來指定一個壓縮級別,默認的等級是9,也是最高的壓縮等級。等級越低性能越好,可是數據壓縮程度也越低。
with gzip.open('somefile.gz', 'wt', compresslevel=5) as f:
    f.write(text)

 

六:固定大小記錄的文件迭代
from functools import partial
RECORD_SIZE= 32
# somefile.data是二進制文件
with open('somefile.data', 'rb') as f:
    records = iter(partial(f.read, RECORD_SIZE), b'')
    for r in records:
        ...
相關文章
相關標籤/搜索