2012-03-11 71 views
1

我想讀取非文本文件。它有一個擴展「.map」,但可以通過記事本打開。我應該如何通過python打開這個文件?將非文本文件讀入Python

file = open("path-to-file","r")不適用於我。它返回沒有這樣的文件或目錄:錯誤。

這裏是我的文件看起來像:

111 + gi|89106884|ref|AC_000091.1| 725803 TCGAGATCGACCATGTTGCCCGCCT IIIIIIIIIIIIIIIIIIIIIIIII 0 14:A>G 457 + gi|89106884|ref|AC_000091.1| 32629 CCGTGTCCACCGACTACGACACCTC IIIIIIIIIIIIIIIIIIIIIIIII 0 4:C>G,22:T>C 779 + gi|89106884|ref|AC_000091.1| 483582 GATCACCCACGCAAAGATGGGGCGA IIIIIIIIIIIIIIIIIIIIIIIII 0 15:A>G,18:C>G 784 + gi|89106884|ref|AC_000091.1| 226200 ACCGATAGTGAACCAGTACCGTGAG IIIIIIIIIIIIIIIIIIIIIIIII 1

如果我做的follwing:

file = open("D:\bowtie-0.12.7-win32\bowtie-0.12.7\output_635\results_NC_000117.fna.1.ebwt.map","rb") 

它仍然給我No such file or directory: 'D:\x08owtie-0.12.7-win32\x08owtie-0.12.7\\output_635\results_NC_000117.fna.1.ebwt.map'錯誤。這是因爲該文件不是二進制文件,或者我沒有一些權限?

會apppreciate這個幫助!

+0

「不起作用」? – 2012-03-11 06:29:15

+0

定義「不適合我」。請閱讀[常見問題]並[請]瞭解您應該在問題中提供的基本信息。影像走進一家汽車修理店,並說「我的車不會跑,它有什麼問題」? (並且汽車無處可見) – 2012-03-11 06:29:24

+0

如果您要上傳示例文件,可能會有所幫助。 – Adobe 2012-03-11 06:29:51

回答

6

二進制文件應該使用二進制模式。

f = open("path-to-file","rb") 

但是,如果您沒有適當的權限或者不知道文件本身的格式,這將無濟於事。

編輯:

顯然,你沒有打擾閱讀錯誤信息,或者你會注意到它正在使用的文件名是不是你所期望的一個。

f = open("D:\\bowtie-0.12.7-win32\\bowtie-0.12.7\\output_635\\results_NC_000117.fna.1.ebwt.map","rb") 
f = open(r"D:\bowtie-0.12.7-win32\bowtie-0.12.7\output_635\results_NC_000117.fna.1.ebwt.map","rb") 
+0

試過這種方法,但沒有真正起作用。也許是由於它不是二進制文件?我編輯了問題 – dawnoflife 2012-03-11 06:44:55

1

如果它是非文本文件,您可以嘗試使用binary格式打開它。試試這個 -

with open("path-to-file", "rb") as f: 
    byte = f.read(1) 
    while byte != "": 
     byte = f.read(1) # Do stuff with byte. 

with語句處理打開和關閉文件,其中包括了一個異常在內部塊中引發。

當然,由於格式是二進制文件,所以在閱讀完後你需要知道你要做什麼。另外,在這裏我一次讀取1個字節,您也可以定義更大的塊大小。

UPDATE:也許這不是一個二進制文件。你可能會遇到文件編碼的問題,這些字符可能不是ascii,或者它們可能屬於unicode字符集。試試這個吧 -

import codecs 
f = codecs.open(u'path-to-file','r','utf-8') 
print f.read() 
f.close() 

如果你在終端打印出來,你可能仍然會得到亂碼,因爲終端可能不支持這個字符集。我建議,繼續&處理文本假設其正確打開。

Source

+0

用'rb'選項打開文件似乎不適用於我:/ – dawnoflife 2012-03-11 06:48:03

+0

檢查我更新的答案 – 2012-03-11 06:51:49

1

您在Unix和Windows之間在這裏一個微小的差別都打。

既然你提到記事本,你必須在Windows上運行它。在DOS/Windows域中,打開二進制文件需要爲二進制文件指定屬性「b」,正如其他人已經指出的那樣。 Unix/Linux對此稍微放鬆一些。省略屬性'b'仍然會打開一個二進制文件。

C庫的fopen()調用中表現出相同的行爲。

+0

僅僅是因爲* nix上的文本和二進制文件沒有區別。 – 2012-03-11 06:44:34