1. 程式人生 > >讀寫文本數據

讀寫文本數據

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(bHello 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 = bHello 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的數據: bHello 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(bbinary data)
4 data = s.getvalue()
5 print("數據類型:", type(data))
6 print("data的值:", data)

以上代執行輸出的結果為:

數據類型: <class bytes>
data的值: bbinary data

註意:

  需要註意的是, StringIO 和BytesIO 實例並沒有正確的整數類型的文件描述符。因此,它們不能在那些需要使用真實的系統級文件如文件,管道或者是套接字的程序中使用

  

讀寫文本數據