определите тип значения, которое представлено как строка в Python

Когда я читал, запятая разделила файл или строку с csv синтаксическим анализатором в Python, все объекты представлены как строка. посмотрите пример ниже.

import csv
a = "1,2,3,4,5"
r = csv.reader([a])
for row in r:
    d = row

d ['1', '2', '3', '4', '5'] type(d[0]) <type 'str'>

Я хочу определить для каждого значения, если это - строка, плавание, целое число или дата. Как я могу сделать это в Python?

8
задан Tendayi Mawushe 20 January 2010 в 19:55
поделиться

7 ответов

Вы можете сделать что-то вроде этого:

from datetime import datetime

tests = [
    # (Type, Test)
    (int, int),
    (float, float),
    (datetime, lambda value: datetime.strptime(value, "%Y/%m/%d"))
]

def getType(value):
     for typ, test in tests:
         try:
             test(value)
             return typ
         except ValueError:
             continue
     # No match
     return str

>>> getType('2010/1/12')
<type 'datetime.datetime'>
>>> getType('2010.2')
<type 'float'>
>>> getType('2010')
<type 'int'>
>>> getType('2013test')
<type 'str'>

Ключ находится в порядке тестов, например тест INT должен быть перед тестом по плаванию. И для датов вы можете добавить больше тестов на форматы, которые вы хотите поддержать, но, очевидно, вы не можете покрыть все возможные случаи.

14
ответ дан 5 December 2019 в 06:37
поделиться

Нет Real Ответ на это, насколько я могу сказать, поскольку это просто строки. Они не целые числа или плавают или что-то еще. Это роли, которые вы решаете. например. 1 Целое число или поплавок?

Неужели пара вещей, хотя. Один из них - сделать какое-то сопоставление образец (например, если он содержит десятичную точку, это плавать и т. Д.). Для приспособления / угадывания даты, вы можете попробовать это или это .

Вы также можете попробовать «кастинг» элемент на то, что вы хотите, и поймать исключения, чтобы попробовать остальных. Вы можете сделать что-то вроде попробовать INT, если он не удается, попробуйте Float и, если это не удается, попробуйте дату и т. Д.

2
ответ дан 5 December 2019 в 06:37
поделиться

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

Так что позволяет сначала разработать несколько эвристики, а затем кодировать их в Python. Вещи, которые следует учитывать:

  • Все значения являются действительными строками, которые мы знаем, что это, потому что это основа нашей проблемы, так что нет смысла проверять на это вообще. Мы должны проверить все остальное, что мы можем, что угодно, мы можем просто уйти как строку.
  • Даты являются наиболее очевидной вещью, чтобы сначала проверить, если они отформатированы в предсказуемом способе, таким как [yyyy] - [мм] - [DD]. ( ISO ISO 8601 Формат даты ) Они легко отличить от других битов текста, которые содержат числа. Если даты находятся в формате с такими номерами, как yyyymmdd , то мы застряли, так как эти даты будут неотличимы от обычных чисел.
  • Мы будем делать целые числа следующими, потому что все целые числа действительны поплавки, но не все поплавки являются действительными целыми числами. Мы могли бы просто проверить, содержит ли текст на цифры (или цифры и буквы A-F, если возможны шестнадцатеричные числа) в этом случае относиться к значению как целое число.
  • Поплавки будут рядом, когда они являются числами с некоторым форматированием (десятичная точка). Это легко распознать 3.14159265 как номер с плавающей запятой. Однако 5.0 5.0 , которые можно записать просто как 5 также является действительным поплавком, но было бы поймано на предыдущих шагах и не быть признанным как поплавка, даже если он должен был быть.
  • Любые значения, которые остаются безвертываемыми, могут рассматриваться как строки.

Из-за возможных перекрытий, которые я упоминал выше , такая схема никогда не может быть на 100% надежна . Также любой новый тип данных, который вам нужен для поддержки (возможно, комплексное число) понадобится собственный набор эвристики и должен будет поместить в наиболее подходящее место в цепочке чеков. Чем скорее чек состоит в том, чтобы соответствовать только типу данных, желаемы, чем выше цепочка, которую она должна быть.

Теперь давайте сделаем это реальным в Python, большая часть эвристики, которую я упомянул выше, заботится о нас Python, нам просто нужно решить приказ о том, чтобы применить их:

from datetime import datetime

heuristics = (lambda value: datetime.strptime(value, "%Y-%m-%d"),
              int, float)

def convert(value):
    for type in heuristics:
        try:
            return type(value)
        except ValueError:
            continue
    # All other heuristics failed it is a string
    return value

values = ['3.14159265', '2010-01-20', '16', 'some words']

for value in values:
    converted_value = convert(value)
    print converted_value, type(converted_value)

Это выводит следующее:

3.14159265 <type 'float'>
2010-01-20 00:00:00 <type 'datetime.datetime'>
16 <type 'int'>
some words <type 'str'>
7
ответ дан 5 December 2019 в 06:37
поделиться

То, что вы хотите достичь, сложно, потому что типы неоднозначны: «1» может быть либо строка, либо INT. Во всяком случае, вы можете попробовать что-то вроде этого:

  • Даты:

    • Даты: Предположительно, они в известном формате: если это так, вы можете попробовать создать экземпляр DateTime из String Timestamp ( DateTime.Str3 () )) И если это не удается, вы знаете, что это не равнодушное значение.

    • Поплавки: Убедитесь, что все персонажи либо цифра, и есть как минимум один «». в строке. Затем преобразуйте в Float ( поплавок (значение) )

    • Целые числа: Regex Строка и списка цифр. Убедитесь, что строка такая же длина длина, что и исходная строка, затем преобразуется ( int (значение) )

    • Если ни одно из вышеперечисленного не работало, это строка.

1
ответ дан 5 December 2019 в 06:37
поделиться

В Руководстве :

Верните объект читателя, который будет Итайте в соответствии с линиями в данном CSVFile. CSVFile может быть любым объектом который поддерживает протокол итератора и возвращает строку каждый раз его Далее () метод называется - файловые объекты и список объектов подходят.

Интерфейс требует, чтобы строка была возвращена каждый раз, когда вызывается следующая ().

0
ответ дан 5 December 2019 в 06:37
поделиться

Дата немного сложнее. Это зависит от формата и насколько это регулярно. Вот подсказка, чтобы вы начали на остальном.

>>> int('a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'a'
>>> int('1')
1
>>> float('1')
1.0
>>> float('1.0')
1.0

Но обратите внимание:

>>> int(1.0)
1
0
ответ дан 5 December 2019 в 06:37
поделиться

Ну .. Вы не можете.

Как бы вы решили, что «5» подразумевается как строка или целое число? Как бы вы решили, что «20100120» подразумевается как целое число или дата?

Вы, конечно, могут сделать образованные догадки и реализовать какой-то порядок анализа. Сначала попробуйте как дату, затем в качестве поплавка, а затем как int, и, наконец, как строка.

1
ответ дан 5 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: