Интерпретация строк как других типов данных в Python - PullRequest
5 голосов
/ 31 января 2012

Я читаю файл в python 2.4, который структурирован следующим образом:

field1: 7
field2: "Hello, world!"
field3: 6.2

Идея состоит в том, чтобы разобрать его в словарь, который принимает fieldfoo в качестве ключа, и все, что идет после двоеточия какзначение.

Я хочу преобразовать все, что находится после двоеточия, в его «фактический» тип данных, то есть '7' следует преобразовать в int, "Hello, world!" в строку и т. д.Единственные типы данных, которые необходимо проанализировать, это целые числа, числа с плавающей запятой и строки.Есть ли в стандартной библиотеке Python функция, позволяющая легко выполнить это преобразование?

Единственные вещи, которые следует использовать для анализа, были написаны мной, поэтому (по крайней мере, в этом случае) безопасность не являетсявопрос.

Ответы [ 7 ]

6 голосов
/ 31 января 2012

Сначала проанализируйте ваш ввод в список пар, таких как fieldN: some_string.Вы можете сделать это легко с помощью модуля re, или, возможно, еще проще, срезая левый и правый от индекса line.strip().find(': ').Затем используйте литерал eval для значения some_string:

>>> import ast
>>> ast.literal_eval('6.2')
6.2
>>> type(_)
<type 'float'>
>>> ast.literal_eval('"Hello, world!"')
'Hello, world!'
>>> type(_)
<type 'str'>
>>> ast.literal_eval('7')
7
>>> type(_)
<type 'int'>
2 голосов
/ 31 января 2012

Вы можете сначала попытаться преобразовать его в int, используя встроенную функцию int(). Если строка не может быть интерпретирована как int, возникает исключение ValueError. Затем вы можете попытаться преобразовать в float, используя float(). Если это также не удалось, просто верните исходную строку

def interpret(val):
    try:
        return int(val)
    except ValueError:
        try:
            return float(val)
        except ValueError:
            return val
2 голосов
/ 31 января 2012

Для более старых версий Python, таких как запрашиваемая, можно использовать функцию eval, но, чтобы уменьшить злость, dict, чтобы быть глобальным пространством имен, следует использовать в качестве второго аргумента для Избегайте вызовов функций.

>>> [eval(i, {"__builtins__":None}) for i in ['6.2', '"Hello, world!"', '7']]
[6.2, 'Hello, world!', 7]
1 голос
/ 31 января 2012

Поскольку "анализируются только типы данных int, float и str" , возможно, что-то подобное будет работать для вас:

entries = {'field1': '7', 'field2': "Hello, world!", 'field3': '6.2'}

for k,v in entries.items():
    if v.isdecimal():
        conv = int(v)
    else:
        try:
            conv = float(v)
        except ValueError:
            conv = v
    entries[k] = conv

print(entries)
# {'field2': 'Hello, world!', 'field3': 6.2, 'field1': 7}
0 голосов
/ 09 мая 2018

Существует strconv lib.

In [22]: import strconv
/home/tworec/.local/lib/python2.7/site-packages/strconv.py:200: UserWarning: python-dateutil is not installed. As of version 0.5, this will be a hard dependency of strconv fordatetime parsing. Without it, only a limited set of datetime formats are supported without timezones.
  warnings.warn('python-dateutil is not installed. As of version 0.5, '

In [23]: strconv.convert('1.2')
Out[23]: 1.2

In [24]: type(strconv.convert('1.2'))
Out[24]: float

In [25]: type(strconv.convert('12'))
Out[25]: int

In [26]: type(strconv.convert('true'))
Out[26]: bool

In [27]: type(strconv.convert('tRue'))
Out[27]: bool

In [28]: type(strconv.convert('12 Jan'))
Out[28]: str

In [29]: type(strconv.convert('12 Jan 2018'))
Out[29]: str

In [30]: type(strconv.convert('2018-01-01'))
Out[30]: datetime.date
0 голосов
/ 31 января 2012

Спасибо wim за помощь в выяснении того, что мне нужно искать, чтобы понять это.

Можно просто использовать eval():

>>> a=eval("7")
>>> b=eval("3")
>>> a+b
10
>>> b=eval("7.2")
>>> a=eval("3.5")
>>> a+b
10.699999999999999
>>> a=eval('"Hello, "')
>>> b=eval('"world!"')
>>> a+b
'Hello, world!'
0 голосов
/ 31 января 2012

Надеюсь, это поможет сделать то, что вы пытаетесь сделать:

#!/usr/bin/python

a = {'field1': 7}
b = {'field2': "Hello, world!"}
c = {'field3': 6.2}

temp1 = type(a['field1'])
temp2 = type(b['field2'])
temp3 = type(c['field3'])

print temp1
print temp2
print temp3
...