2013-10-20 50 views
1

您好,我無法編寫然後從文件中讀取確切的數據。由於Python中的 r,無法從文件中檢索正確的數據

什麼我做的是先轉換liststring,然後將其寫入到文件

S = [63, 16, 13, 30, 22, 13, 99, 68, 75, 91, 73, 80, 90] 

現在,如果我這樣做是爲了把它轉換爲字符串,

UpdatedPlainText = ''.join(chr(s) for s in S) 

print("This is the Data:", UpdatedPlainText) 

數據將由於存在兩個int13原始List,這等於\r

輸出:

cDK[IPZ the Data: ?► 

我知道這只是顯示這樣的,但是原始數據仍然存在。

的數據可被檢索回用這個, 這裏數據是拳頭轉換爲整數打印之前,

L = list(ord(s) for s in UpdatedPlainText) 
print(L) 

輸出:

[63, 16, 13, 30, 22, 13, 99, 68, 75, 91, 73, 80, 90] 

而不是直接轉換數據回 integer from String, 如果我首先將 UpdatedPlainText的值寫入一個文件,

PlainText = open('uText.txt', 'w') 
PlainText.write(UpdatedPlainText) 
PlainText.close() 

然後read這個文件,

PlainText = open('uText.txt', 'r') 
PlainText = PlainText.read() 

,然後打印從文件中的數據,

L = list(ord(s) for s in PlainText) 
print(L) 

輸出會有所不同,

[63, 16, 10, 30, 22, 10, 99, 68, 75, 91, 73, 80, 90] 

正如你所看到的,值13被替換爲10,這是由於\r,相當於13

我該如何解決這個問題? 如何防止13轉換爲\r

回答

1

關於python文檔它說:

在Windows上的Python區分文本和二進制文件;數據讀取或寫入時,文本文件中的行尾字符會自動稍微改變。

您試圖檢索數據不喜歡的文字,因此,使用二進制模式是一個選項(參見上文答案的文檔接着說:。

這幕後的修改文件數據對於ASCII文本文件來說很好,但它會破壞像JPEG或EXE文件那樣的二進制數據。在讀寫這些文件時要非常小心地使用二進制模式。在Unix上,不會因爲追加'b'到模式,所以你可以使用它平臺無關的所有二進制文件。

就像你的情況一樣,默認模式是改變數據。所以如果你想由於某種原因默認使用讀寫選項,你可以嘗試在將它寫入文件之前對其進行編碼。

PlainText.encode('base64','strict') 

和閱讀後,解碼

PlainText.decode('base64','strict') 

工作太多,只是另一種選擇。

0

您正在以「text」模式打開文件,而不是「binary」。如上所述:http://docs.python.org/2/library/functions.html#open您應該使用'bw'模式來避免在某些平臺上寫入/讀取時可能會轉換換行符。

PlainText = open('uText.txt', 'bw') 
... 
PlainText = open('uText.txt', 'br') 
0

閱讀二進制模式的文件:

with open('uText.txt', 'rb') as f: 
    L = [x for x in f.read()] 
0

是您只是在文件中存儲這些數字來讀回後的目標?還是你特意試圖學習/使用二進制文件?如果你的目標是拯救數,那麼你就需要轉換爲字符串等使用JSON或類似的東西...

import json 
with open('uText.txt','w') as txtfile: 
    json.dump(S,txtfile) 

以後要閱讀他們:

with open('uText.txt','r') as infile: 
    newList = json.load(infile) 
相關問題