讀寫文本數據
阿新 • • 發佈:2017-08-05
cep bytes 參數 final class pan tex 文件 字符串
使用其他分隔符或行終止符打印
問題:
你想使用print() 函數輸出數據,但是想改變默認的分隔符或者行尾符。
解決方案:
可以使用在print() 函數中使用sep 和end 關鍵字參數,以你想要的方式輸出。比如:
1 #正常輸出 2 print(‘dmeon‘, 89 , 8, 23) 3 4 #指定分隔符, 5 print(‘dmeon‘, 89 , 8, 23, sep=‘,‘) 6 7 #指定結尾符號 8 print(‘dmeon‘, 89 , 8, 23, sep=‘,‘,end=‘!!!\n‘) 9 10 #使用end 參數也可以在輸出中禁止換行。比如: 11 for i in range(5): 12 print(i, end=‘ ‘) 13 14 #另外一種添加分隔符的方法 15 print() 16 print(‘分隔符的方法‘.center(30, ‘-‘)) 17 s1 = (‘dmeon‘, 89 , 8, 23) 18 result = ‘ ‘.join((str(s) for s in s1)) 19 print(result) 20 21 #高逼格的方法 22 print("s1的值", s1) 23 print(‘高逼格的輸出方式‘, *s1,sep=‘,‘)
以上代執行輸出的結果為:
dmeon 89 8 23 dmeon,89,8,23 dmeon,89,8,23!!! 0 1 2 3 4 ------------分隔符的方法------------ dmeon 89 8 23 s1的值 (‘dmeon‘, 89, 8, 23) 高逼格的輸出方式,dmeon,89,8,23
讀寫字節數據
問題:
你想讀寫二進制文件,比如圖片,聲音文件等等
解決方案:
使用模式為rb 或wb 的open() 函數來讀取或寫入二進制數據。比如:
1 #使用with打開文件,不需要考慮文件close的問題,rb模式是使用讀二進制的模式打開 2 with open(‘/tmp/go.pdf‘, ‘rb‘) as f: 3 #獲取文件中的內容 4 data = f.read() 5 6 #wb是寫的二進制模式打開,當文件存在會覆蓋文件已有的內容,文件不存在會創建 7 with open(‘/tmp/test.bin‘,‘wb‘) as f: 8 f.write(b‘Hello World‘) 9 10 #天坑,讀取二進制數據的時候,字節字符串和文本字符串的語義差異可能會導致一個潛在的陷阱 11 t = ‘Hello World‘ 12 print("t中0索引第一個元素為:", t[0]) 13 14 #循環t並打印每個元素 15 for i in t: 16 print(‘循環t中的每個元素:‘, i) 17 18 #坑的地方來了 19 print(‘*‘*30) 20 b = b‘Hello World‘ 21 print(‘b中0索引的元素:‘, b[0]) 22 23 #循環bytes類型b變量中的每個元素 24 for x in b: 25 print(‘循環b中的每個元素:‘, x)
以上代執行輸出的結果為:
t中0索引第一個元素為: H 循環t中的每個元素: H 循環t中的每個元素: e 循環t中的每個元素: l 循環t中的每個元素: l 循環t中的每個元素: o 循環t中的每個元素: 循環t中的每個元素: W 循環t中的每個元素: o 循環t中的每個元素: r 循環t中的每個元素: l 循環t中的每個元素: d ****************************** b中0索引的元素: 72 循環b中的每個元素: 72 循環b中的每個元素: 101 循環b中的每個元素: 108 循環b中的每個元素: 108 循環b中的每個元素: 111 循環b中的每個元素: 32 循環b中的每個元素: 87 循環b中的每個元素: 111 循環b中的每個元素: 114 循環b中的每個元素: 108 循環b中的每個元素: 100
如果你想從二進制模式的文件中讀取或寫入文本數據,必須確保要進行解碼和編碼操作。比如:
1 with open(‘/tmp/test.bin‘, ‘rb‘) as f: 2 data = f.read(16) 3 print(‘data的數據類型:‘, type(data)) 4 print(‘data的數據:‘, data) 5 6 text = data.decode(‘utf-8‘) 7 print(‘data轉碼以後的數據類型:‘, type(text)) 8 print(‘text的數據:‘, text)
以上代執行輸出的結果為:
data的數據類型: <class ‘bytes‘> data的數據: b‘Hello World‘ data轉碼以後的數據類型: <class ‘str‘> text的數據: Hello World
文件不存在才能寫入
問題:
你想像一個文件中寫入數據,但是前提必須是這個文件在文件系統上不存在。也就是不允許覆蓋已存在的文件內容
解決方案:
可以在open() 函數中使用x 模式來代替w 模式的方法來解決這個問題。比如:
1 #如果文件存在,會覆蓋內容,如果文件不存在會創建文件並寫入內容 2 with open(‘/tmp/test.bin‘, ‘wt‘) as f: 3 f.write(‘Hello\n‘) 4 5 #如果文件存在,會報異常,否則創建文件並寫入內容,如果文件是二進制,使用wb代替 6 try: 7 f = open(‘/tmp/test.bin‘, ‘xt‘) 8 except Exception as e: 9 print(e) 10 else: 11 f.write(‘Hello\n‘) 12 finally: 13 f.close()
以上代執行輸出的結果為:
[Errno 17] File exists: ‘/tmp/test.bin‘
字符串的I/O 操作
問題:
你想使用操作類文件對象的程序來操作文本或二進制字符串
解決方案:
使用io.StringIO() 和io.BytesIO() 類來創建類文件對象操作字符串數據。比如:
1 import io 2 3 s = io.StringIO() 4 print(s.write(‘Hello World\n‘)) 5 6 print(‘This is a test‘, file=s) 7 8 #獲取s中的內容 9 content = s.getvalue() 10 print(‘s中的內容為:‘, content) 11 12 #讀取5個長度的內容 13 s = io.StringIO(‘Hello\nWorld\n‘) 14 print("五個字符的內容:") 15 print(s.read(5)) 16 17 #讀取剩余的內容 18 print("剩余的內容:") 19 print(s.read())
以上代執行輸出的結果為:
12 s中的內容為: Hello World This is a test 五個字符的內容: Hello 剩余的內容: World
io.StringIO 只能用於文本。如果你要操作二進制數據,要使用io.BytesIO 類來代替。比如:
1 import io 2 s = io.BytesIO() 3 s.write(b‘binary data‘) 4 data = s.getvalue() 5 print("數據類型:", type(data)) 6 print("data的值:", data)
以上代執行輸出的結果為:
數據類型: <class ‘bytes‘> data的值: b‘binary data
註意:
需要註意的是, StringIO 和BytesIO 實例並沒有正確的整數類型的文件描述符。因此,它們不能在那些需要使用真實的系統級文件如文件,管道或者是套接字的程序中使用
讀寫文本數據