方式
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