Как правильно отформатировать и передать файл json как объект параметров в функцию pandas? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть JSON-файл, который содержит параметры / опции для функции read_excel панд. У меня проблемы с передачей их в вызов этой функции.

Файл JSON структурирован примерно так:

{
    "io": "~/home/test.xlsx",
    "sheet_name": "Sheet1",
    "header": 0,
    "usecols": 2,
    "engine": "xlrd",
    "converters": {
            "col1": "np.float64",
            "col2": "np.float64"
    }
}

И я называю это в своем скрипте Python так:

import pandas as pd
import numpy as np
import json
with open('json.json', 'r') as opened:

        options = json.loads(opened.read())

        import_pd_df = pd.read_excel(**options)

        print(import_pd_df)

Когда у меня есть опции, объявленные как словарь в скрипте Python, и я удаляю двойные кавычки, которые находятся вокруг np.float64, скрипт работает. Но когда я перемещаю параметры в файл JSON, он не может выполнить синтаксический анализ np.float64.

Я получаю ошибку: TypeError: 'str' object is not callable

Есть ли способ правильно отформатировать JSON для использования в качестве параметров в функции?

Ответы [ 4 ]

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

Проблема в том, что вы пытаетесь использовать строковое значение для представления символа Python.

К сожалению, JSON может представлять только число и строки и ничего не знает о символических значениях, таких как np.float64, поэтому не можетразбери их.Аналогично, не будет работать вызов 10000 * со строковыми значениями для этих параметров (но он работал без кавычек, потому что тогда вы использовали правильные значения - функции, которые Python может вызывать).

Выпоэтому перед прочтением словаря придется выполнить какое-то преобразование после прочтения ввода JSON, который можно передать excel_read,

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

попробуйте это, прочитайте .json не как строку json.load (открыт) * ​​1002 *. загрузка для файла, загрузка для строки ...

import pandas as pd
import numpy as np
import json
with open('json.json') as opened:

        options = json.load(opened)

        import_pd_df = pd.read_excel(**options)

        print(import_pd_df)
0 голосов
/ 13 сентября 2018

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 имеет аналогичные проблемы: вам придется доверять стороне, которая предоставляет вам файл.

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

При чтении данных в формате JSON из внешнего файла используйте json.load(file_path), например:

import json with open(file_path, 'r') as j: obj = json.load(j)

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