Numpy не находит временный файл - PullRequest
0 голосов
/ 20 сентября 2018

Я выполняю CGI-скрипт на python, используя numpy для чтения данных из CSV, созданного на лету.Numpy жалуется, что не может найти файл, но он там есть.Из скрипта python я могу использовать system (cat), чтобы напечатать файл заранее ...

filename is: /tmp/file3aQJRn
Dump file with system(cat)...
A
-257
-1
-136
29567
-97
-8867
-27041
-12323
-17473
-659
Ask numpy to read it...
Traceback (most recent call last):
  (some lines deleted, then...)
  File "request", line 195, in get_rawcsv_column
    col_data = get_csv_column(fname,column)
  File "request", line 189, in get_csv_column
    all_data = np.genfromtxt(fname,delimiter=",")
  File "usr/lib/python3.6/site-packages/numpy/lib/npyio.py", line 1551, in genfromtxt
  File "usr/lib/python3.6/site-packages/numpy/lib/_datasource.py", line 151, in open
  File "usr/lib/python3.6/site-packages/numpy/lib/_datasource.py", line 501, in open
OSError: "/tmp/file3aQJRn" not found.

После этого я могу вывести файл в командной строке bash:

# cat /tmp/file3aQJRn
A
-257
-1
-136
29567
-97
-8867
-27041
-12323
-17473
-659

ИЯ могу вызвать Python (3.6) и numpy, чтобы прочитать файл ...

numpy.genfromtxt("/tmp/file3aQJRn",delimiter=",")
array([             nan,  -2.57000000e+02,  -1.00000000e+00,
        -1.36000000e+02,   2.95670000e+04,  -9.70000000e+01,
        -8.86700000e+03,  -2.70410000e+04,  -1.23230000e+04,
        -1.74730000e+04,  -6.59000000e+02])

(Nan не проблема. Это заголовок столбца, который впоследствии удаляется из массива.)

Что здесь происходит?Временный файл создается приложением C ++ с использованием std :: ofstream, получив временное имя файла от tmpnam ().

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Это была глупая ошибка кодирования.Имя файла numpy фактически было заключено в кавычки!

0 голосов
/ 20 сентября 2018

From: https://github.com/numpy/numpy/blob/master/numpy/lib/_datasource.py#L610

Похоже, что numpy пытается найти файл (ваша версия выглядит иначе).Перед этой строкой есть предупреждение, указывающее, что его метод _findfile(path) не будет выполнен в файле, открытом для записи.Я хотел бы убедиться, что ваше приложение C ++ не имеет открытого файла, пока вы пытаетесь его прочитать.

...