我想在非文本文件中阅读。它有一个扩展名“。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'
错误。这是因为文件不是二进制文件还是我没有权限?
会为此提供帮助!
答案 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()
如果你在终端中打印出来,你可能仍会得到胡言乱语,因为终端可能不支持这个字符集。我会建议,继续&假设其正确打开,处理文本。
答案 2 :(得分:1)
你在这里找到了Unix和Windows之间的细微差别。
由于您提到了记事本,您必须在Windows上运行它。在DOS / Windows领域,打开二进制文件需要为二进制指定属性'b',正如其他人已经指出的那样。 Unix / Linux对此更加放松。省略属性“b”仍将打开二进制文件。
在C库的fopen()调用中表现出相同的行为。