Чтение нетекстовых файлов в Python - PullRequest
1 голос
/ 11 марта 2012

Я хочу прочитать в нетекстовом файле. Он имеет расширение ". 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<br>

Если я сделаю следующее:

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 ]

6 голосов
/ 11 марта 2012

Двоичные файлы должны использовать двоичный режим.

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

Но это не поможет, если у вас нет соответствующих разрешений или вы не знаете формат самого файла.

EDIT:

Очевидно, что вы не удосужились прочитать сообщение об ошибке, или вы заметили бы, что используемое имя файла не такое, как вы ожидали.

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 голос
/ 11 марта 2012

Вы столкнулись с небольшой разницей между Unix и Windows здесь.

Поскольку вы упомянули Блокнот, вы должны запустить его в Windows. В среде DOS / Windows открытие двоичного файла требует указания атрибута 'b' для двоичного файла, как уже указали другие. Unix / Linux немного более раскованы по этому поводу. Если пропустить атрибут «b», он все равно откроет двоичный файл.

Такое же поведение проявляется в вызове fopen () библиотеки C.

1 голос
/ 11 марта 2012

Если это не текстовый файл, попробуйте открыть его в формате 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()

Если вы распечатаете это в терминале, вы все равно можете получить бред, поскольку терминал может не поддерживать эту кодировку. Я бы посоветовал продолжить и обработать текст, предполагая, что он правильно открыт.

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...