Вывести тип данных в строку

88
12

Я хотел бы попытаться вывести тип данных в строке.


Сценарий:

У меня есть файл CSV, который содержит строки данных, и я хотел бы сохранить эти данные в базе данных.

Я не хочу хранить все поля в виде строк.

Поскольку поля в CSV могут меняться, я не могу ничего о них знать.


Пример (файл CSV):


[Row 1 - column names] --> "name", "age" , "children"
[Row 2 - data row ] --> "John", "45.5", "3"
...
[Row n - data row ] --> ...

В этом случае, посмотрев на данные в строках, я хотел бы сделать вывод, что name - это столбец строк, age - столбец с плавающей точкой, а children - столбец целых чисел.


Моя попытка:

Самый простой подход - попробовать конверсии и выбрать тип, когда произойдет определенное преобразование.

Я написал метод для этой цели, который выглядит следующим образом:


def deduceType(str):
try:
#first try to convert to int:
int(str)
return 0 #integer
except ValueError:
try:
#not integer, try float:
float(str)
return 1 #float
except ValueError:
#not float, so deduct string
return 2 #string

Мой вопрос:

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


Есть ли более аккуратный, более эффективный и строгий способ сделать это?


Ответ (изменить):

На основании ответа Martijn Pieters я делаю это:


def deduceType(str):
try:
return type(ast.literal_eval(str))
except ValueError:
return type('') #string

спросил(а) 2021-01-28T02:10:52+03:00 2 месяца, 2 недели назад
1
Решение
129

Используйте ast.literal_eval() значение; он будет интерпретировать его как литерал python. Если это не удается, у вас есть строка.

>>> import ast
>>> ast.literal_eval("45.5")
45.5
>>> ast.literal_eval("3")
3
>>> ast.literal_eval("John")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ast.py", line 68, in literal_eval
return _convert(node_or_string)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ast.py", line 67, in _convert
raise ValueError('malformed string')
ValueError: malformed string

ответил(а) 2021-01-28T02:10:52+03:00 2 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема