Numpy: npyio.loadtxt - это ввод текстового файла с преобразованием байтов, даже если указан str dtype.

Созданный на 8 нояб. 2012  ·  11Комментарии  ·  Источник: numpy/numpy

Окружающая обстановка

  • Python: версия 3.3 (выпуск python.org) в OS X Mountain Lion
  • numpy: клонировано из мастера git

При вызове numpy.loadtxt для файла, содержащего следующие строки:

import numpy as np
datestxt = np.loadtxt("NYSE_dates.txt", dtype=str)
print(datetxt)

Где NYSE_dates.txt - это просто список дат (на самом деле может быть что угодно):

7/5/1962
7/6/1962
7/9/1962
...
12/29/2020
12/30/2020
12/31/2020

Выход:

["b'7/5/1962'" "b'7/6/1962'" "b'7/9/1962'" ..., "b'12/29/2020'"
 "b'12/30/2020'" "b'12/31/2020'"]

Как видите, все строки были преобразованы в байты, а затем преобразованы в строку через conv , так как вы получите тот же результат от str(str('12/31/2020').encode('latin1')) на conv & compat.asbytes .

После просмотра кода кажется, что все строки содержат байты с asbytes(...) почти повсюду, как, например, в split_line(...) , так что это должно означать, что все подпрограммы в модуле сломаны.

00 - Bug numpy.lib

Самый полезный комментарий

Довольно шокирует, что это не исправляли 5 лет.

Все 11 Комментарий

У меня тоже есть такая проблема. Это очень раздражает; в основном вы не можете использовать loadtxt в Python3.

Временное решение: я удалил все вызовы asbytes () в методе loadtxt.

Да, я помню, как подумал, что там что-то не так, когда просматривал код.

Для записи, я сталкиваюсь с той же проблемой с входами datetime64, что приводит к ошибке синтаксического анализа в форме: Error parsing datetime string "b'2013-01-02'" . Чтобы обойти это, мне пришлось создать конвертер для этого столбца:

def decoder(input_bytes):
    return input_bytes.decode("ascii")

Это было бы хорошо в производственном коде, но очень неприятно для учебных материалов ...

Отталкивание до 1.11.

обходной путь - сначала запустите iconv для файла.

отталкивание до 1.12.

Я вижу, что это продвигается вперед, но я считаю, что это ошибка, которую следует исправить, и исправление, похоже, легко реализуется.

Довольно шокирует, что это не исправляли 5 лет.

Похоже, что в NumPy 1.13.3 это работает должным образом (хотя я не уверен, какой PR исправил это). Можно ли закрыть этот вопрос?

>>> import io
>>> import numpy as np
>>> f = io.StringIO("7/5/1962\n7/6/1962\n")
>>> np.loadtxt(f, dtype=str)
array(['7/5/1962', '7/6/1962'],
      dtype='<U8')
>>> np.__version__
'1.13.3'

Похоже, это было исправлено в # 8349 в ответ на # 8033.

Закрытие. Пожалуйста, откройте повторно, если необходимо.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги