2012-03-11 69 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