np.float64
- это пустой тип d, который также может быть вызван (который должен быть вызываемым, чтобы быть преобразователем с точки зрения pandas
). "np.float64"
- это строка, которая не может быть вызвана. Вам необходимо преобразовать строку, которую вы сохранили в файле JSON ("np.float64"
), в желаемый вызываемый объект (np.float64
). Вы могли бы сделать это так:
import pandas as pd
import numpy as np
import json
with open('json.json', 'r') as opened:
options = json.loads(opened.read())
for col, converter in options["converters"].items():
exec('options["converters"]["{0}"] = {1}'.format(col, converter))
import_pd_df = pd.read_excel(**options)
print(import_pd_df)
Если мы перейдем к pdb
, легко убедиться, что преобразователи столбцов заменены на np.float64
:
-> import_pd_df = pd.read_excel(**options)
(Pdb) l
5 with open('json.json', 'r') as opened:
6 options = json.loads(opened.read())
7 for col, converter in options["converters"].items():
8 exec('options["converters"]["{0}"] = {1}'.format(col, converter))
9 import pdb; pdb.set_trace()
10 -> import_pd_df = pd.read_excel(**options)
11 print(import_pd_df)
[EOF]
(Pdb) options["converters"]["col1"]
<class 'numpy.float64'>
(Pdb) options["converters"]["col2"]
<class 'numpy.float64'>
по желанию.
Примечание. Возможно, вы захотите сохранить файл «options» в виде файла pickle
вместо JSON. Таким образом, вы можете просто сериализовать функции и объекты Python (например, np.float64
) для ваш файл опций. Вам не придется делать глупые преобразования строк. При желании я могу привести пример, но есть много других.
Примечание 2: Это не особенно безопасно. Убедитесь, что вы доверяете стороне, которая предоставляет вам этот файл json.json
. Вы открыты для некоторых довольно серьезных инъекционных атак с кодом выше. pickle
имеет аналогичные проблемы: вам придется доверять стороне, которая предоставляет вам файл.