python文件IO中的二進制格式與文本格式

方式

open() 函數第二個參數是一個字符串,用於指定文件的打開方式,如果該字符串中出現 b,則表示以二進制格式打開文件;反之,則以普通的文本格式打開文件。

對於 Windows平臺最好用 b 打開二進制文件

在 Windows 系統中,文件中用 “\r\n” 作爲行末標識符(即換行符),當以文本格式讀取文件時,會將 “\r\n” 轉換成 “\n”;反之,以文本格式將數據寫入文件時,會將 “\n” 轉換成 “\r\n”。這種隱式轉換換行符的行爲,對用文本格式打開文本文件是沒有問題的,但如果用文本格式打開二進制文件,就有可能改變文本中的數據(將 \r\n 隱式轉換爲 \n)。

而在 Unix/Linux 系統中,默認的文件換行符就是 \n,因此在 Unix/Linux 系統中文本格式和二進制格式並無本質的區別。

總的來說,爲了保險起見,對於 Windows平臺最好用 b 打開二進制文件;對於 Unix/Linux 平臺,打開二進制文件,可以用 b,也可以不用。

本文字來源於:http://c.biancheng.net/view/4723.html

讀寫文本

打開

file = open('filename.ext', openmod)  #打開文件
% openmod :r	r+	w	w+	a	a+
file.close()  #關閉文件

file.write('string')  
file.write('string\n') # 換行
file.write('%10s=%10.2f\n' % ('val', 12.3455)) # 格式化字符串

1、 write函數只能輸出字符串,不能像C語言那樣定義輸出格式。

2、 如果像這麼做,需要先對要輸出的內容轉換爲字符串。

file.write('%10s=%10.2f\n' % ('val', 12.3455)) # 格式化字符串

多行寫入

content = ['I have a dream.\n', 'One day, \n', 'former slaves and slave owners will join together,\n',
           'as brotherhood.\n']
file.writelines(content)

1、writelines()函數不會爲你添加換行符,需要自己添加。

讀入文件內容

file.read() # 讀取文件所有內容
file.read(n) # 讀取前n個字符

需要注意的是read(n)。如果文件中有中文,一箇中文字表示一個字符,不管其中內部編碼是幾個字節。讀取完之後,光標移動n個字符。

utf-8進行的編碼
1、要讀的文本文件的編碼與打開文件時設置的編碼一致。
2、假如我們的文本文件a.txt用的utf-8進行的編碼。就可以進行下面設置。
3、如果兩者沒有設置成一致的,在讀取時就會出錯。
4、在Windows中, open方法打開的文件默認爲GBK編碼

file = open('a.txt', 'r', encoding='utf-8')

readline方式

line1 = file.readline()
str2 = file.readline(n) #讀取本行的n個字符

注意line1中包含回車符,讀取完line1後,讀取位置移動到下一行
讀取完str2後,讀取位置移動n個字符,可能還在本行。
如果n >= 本行的字符數(包含換行符), 最終讀取的內容就是本行的字符,讀取位置移到下一行;
如果n <本行的字符數(包含換行符), 最終讀取的內容長度爲n, 讀取位置移動n個字符,讀取位置還在本行。

讀寫二進制文件

二進制文件中都是一個一個的字節數據。因此讀和寫,都是針對字節數據的。

def readStrFromFile(filePath):
    """
    從文件中讀取字符串str
    param filePath: 文件路徑
    return string : 文本字符串
    """
    with open(filePath, "rb") as f:
        string = f.read()
    return string
b'\xe4\xbd\xa0\xe5\xa5\xbd'
bytes_all = file.read()   #讀取文件所有的字節數據
bytes_read = file.read(n)  #讀取n個字節數據
file.write(bytes_read)     #將字節數據寫到文件

1. 返回指定編碼的字符串表示二進制數據

bytes.decode(encoding="utf-8", errors="strict")
bytearray.decode(encoding="utf-8", errors="strict")
str = "教程";
str_utf8 = str.encode("UTF-8")
str_gbk = str.encode("GBK")
 
print(str)
 
print("UTF-8 編碼:", str_utf8)
print("GBK 編碼:", str_gbk)
 
print("UTF-8 解碼:", str_utf8.decode('UTF-8','strict'))
print("GBK 解碼:", str_gbk.decode('GBK','strict'))

len=f.write('長風破浪會有時\r\n直掛雲帆濟滄海'.encode('utf-8'))

2. 其他的格式的文件的轉換

在使用之前先導入struct庫

import struct
struct.pack(fmt, v1, v2, ...)  #將原始數據v1, v2, ...根據fmt格式轉換爲字節串
val_arr = struct.unpack(fmt, bytes_arr)  #將字節數據byts_arr根據fmt格式轉換爲原始數據元組 val_arr

例子

b1 = struct.pack('>hif', 65, 123, 3.14)
print([hex(i) for i in b1])

這裏的fmt爲’>hif’ 表示數據爲大端順序,h表示一個short類型,也就是2個字節的整數,i表示一個int類型也就是4個字節表示的整數, f表示單精度浮點類型,也是4個字節。 因此這個fmt表示的10個字節的數據。

注意:hif 對應於65,123,3.14
如果是hiff則可以是65,123,3.14,3.15

更多:https://blog.csdn.net/WhoisPo/article/details/88608654

異常處理

異常處理同讀取文件操作,try…finally…和with語句都適用

換行符

用 二進制 模式寫入文本文件時,我們要自己寫換行符的原始碼,在UNIX、linux中的換行符是\n,在windows中換行符是\r\n

通過 os模塊 獲取系統換行符,見下面鏈接:
http://www.malaoshi.top/show_1EF2Q155hwJ9.html

改造上面的程序,動態獲取換行符,如下:

import os
with open('c:/users/mym/desktop/6.txt','wb') as f:
    s='長風破浪會有時'+os.linesep+'直掛雲帆濟滄海'
    len=f.write(s.encode('GBK'))
    print(len)

刷新緩衝區,

將 緩衝區中 的數據立刻 寫入 文件中

f.flush()

例子

import time
with open('c:/users/mym/desktop/2.txt','wb') as f:
    f.write('白日依山盡\n黃河入海流\n')
    f.flush()
    f.write('欲窮千里目\n更上一層樓\n')
    time.sleep(10)

休眠10秒,在10秒內,打開文件,可以看到下面內容:

白日依山盡
黃河入海流
因爲執行了flush()方法刷新緩衝區,寫入文件。10秒後執行結束,再次將緩衝區中的數據寫入文件中,最後結果如下:

白日依山盡
黃河入海流
欲窮千里目
更上一層樓

python3 跨目錄模塊調用

在這裏插入圖片描述

我們使用print(sys.path)將path打印出來

import sys
import os
sys.path.append(os.path.abspath("../model1"))

# os.path.abspath(path)   
# 返回path規範化的絕對路徑。 

參考

https://www.malaoshi.top/show_1EF2PbRmHWiJ.html
https://blog.csdn.net/WhoisPo/article/details/88608654
https://blog.csdn.net/WhoisPo/article/details/88608654
https://www.jianshu.com/p/61ed747680e2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章