Модуль ввода / вывода не найден, несмотря на то, что установлен - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь получить доступ к некоторым данным из общедоступного c источника, однако у меня возникают проблемы с работой модуля fileio, несмотря на его установку с помощью pip. Вот мой код:

from fileio import read
import gzip
odffn = 'test-data/Level1_IC59_data_Run00115150_Part00000000.odf.gz'
f = gzip.open(odffn)
ev = read(f)
hit_dist = list()

while ev :
    # do some analysis with the event
    hit_dist.append(len(ev.hits))
    # get the next event
    ev = read(f)

import pylab
pylab.hist(hit_dist,30,range=(0,1000), log=True, histtype='step')
pylab.title('IceCube Hit Distribution')
pylab.xlabel('nhit')
pylab.savefig('nhits.png')

И я получаю следующую ошибку:

from fileio import read
ModuleNotFoundError: No module named 'fileio'

Тем не менее, я уже проверил с помощью установщика pip,

python -m pip install fileio

И я получить модуль уже установлен. Я не думаю, что это проблема с PATH, поскольку он хорошо работает со всеми другими моделями (например, numpy), поэтому я не совсем уверен, в чем может быть проблема. Я заранее ценю любое понимание.

1 Ответ

0 голосов
/ 15 января 2020

Я посмотрел в пипсах на fileio, и из того, что я могу видеть, это не выглядит законным пакетом. При установке из pip он не устанавливает никаких импортируемых Python модулей или пакетов. Все это создает каталог скелета в site-packages.

. Я думаю, вам следует отступить назад и пересмотреть то, что делает этот код:

from fileio import read
import gzip
odffn = 'test-data/Level1_IC59_data_Run00115150_Part00000000.odf.gz'
f = gzip.open(odffn)
ev = read(f)
hit_dist = list()

Это нормально (игнорирование импорт из fileio), вплоть до строки: ev = read(f). Какова цель использования этой функции для чтения файлового объекта, который возвращает gzip? Этот объект имеет свой собственный набор методов чтения, которые должны выполнять эту работу:

import gzip
odffn = 'test-data/Level1_IC59_data_Run00115150_Part00000000.odf.gz'
f = gzip.open(odffn)
lines = f.readlines()

Предполагая, что это текстовый файл, который должен прочитать все это в виде списка строк, по одному на строку. Вы также можете буферизовать его:

buf_size = 100
buf = f.read(buf_size)
while buf:
    <do something with 1-100 characters of input>
    buf = f.read(buf_size)

или буферизовать целые строки:

line_buf = f.readline()
while line_buf:
    <do something with a line of input>
    line_buf = f.readline()
...