将非文本文件读入Python

时间:2012-03-11 06:27:27

标签: python file

我想在非文本文件中阅读。它有一个扩展名“。map”,但可以通过记事本打开。我应该如何通过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

如果我这样做:

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'错误。这是因为文件不是二进制文件还是我没有权限?

会为此提供帮助!

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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个字节,您也可以定义更大的块大小。

更新:也许这不是二进制文件。您可能遇到文件编码问题,字符可能不是ascii或者它们可能属于unicode字符集。试试这个 -

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

如果你在终端中打印出来,你可能仍会得到胡言乱语,因为终端可能不支持这个字符集。我会建议,继续&假设其正确打开,处理文本。

Source

答案 2 :(得分:1)

你在这里找到了Unix和Windows之间的细微差别。

由于您提到了记事本,您必须在Windows上运行它。在DOS / Windows领域,打开二进制文件需要为二进制指定属性'b',正如其他人已经指出的那样。 Unix / Linux对此更加放松。省略属性“b”仍将打开二进制文件。

在C库的fopen()调用中表现出相同的行为。