Когда я читал, запятая разделила файл или строку с 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?
Вы можете сделать что-то вроде этого:
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 должен быть перед тестом по плаванию. И для датов вы можете добавить больше тестов на форматы, которые вы хотите поддержать, но, очевидно, вы не можете покрыть все возможные случаи.
Нет Real Ответ на это, насколько я могу сказать, поскольку это просто строки. Они не целые числа или плавают или что-то еще. Это роли, которые вы решаете. например. 1
Целое число или поплавок?
Неужели пара вещей, хотя. Один из них - сделать какое-то сопоставление образец (например, если он содержит десятичную точку, это плавать и т. Д.). Для приспособления / угадывания даты, вы можете попробовать это или это .
Вы также можете попробовать «кастинг» элемент на то, что вы хотите, и поймать исключения, чтобы попробовать остальных. Вы можете сделать что-то вроде попробовать INT, если он не удается, попробуйте Float и, если это не удается, попробуйте дату и т. Д.
Это не может быть выполнено надежно, и это не связано с ограничениями в Python или любом другом языке программирования для этого вопроса. Человек не мог сделать это предсказуемым образом, не догадаясь, и после нескольких правил (обычно называется эвристики при использовании в этом контексте).
Так что позволяет сначала разработать несколько эвристики, а затем кодировать их в Python. Вещи, которые следует учитывать:
[yyyy] - [мм] - [DD].
( ISO ISO 8601 Формат даты ) Они легко отличить от других битов текста, которые содержат числа. Если даты находятся в формате с такими номерами, как yyyymmdd
, то мы застряли, так как эти даты будут неотличимы от обычных чисел. 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'>
То, что вы хотите достичь, сложно, потому что типы неоднозначны: «1» может быть либо строка, либо INT. Во всяком случае, вы можете попробовать что-то вроде этого:
Даты:
Даты: Предположительно, они в известном формате: если это так, вы можете попробовать создать экземпляр DateTime из String Timestamp ( DateTime.Str3 ()
)) И если это не удается, вы знаете, что это не равнодушное значение.
Поплавки: Убедитесь, что все персонажи либо цифра, и есть как минимум один «». в строке. Затем преобразуйте в Float ( поплавок (значение)
)
Целые числа: Regex Строка и списка цифр. Убедитесь, что строка такая же длина длина, что и исходная строка, затем преобразуется ( int (значение)
)
Если ни одно из вышеперечисленного не работало, это строка.
Верните объект читателя, который будет Итайте в соответствии с линиями в данном CSVFile. CSVFile может быть любым объектом который поддерживает протокол итератора и возвращает строку каждый раз его Далее () метод называется - файловые объекты и список объектов подходят.
Интерфейс требует, чтобы строка была возвращена каждый раз, когда вызывается следующая ().
Дата немного сложнее. Это зависит от формата и насколько это регулярно. Вот подсказка, чтобы вы начали на остальном.
>>> 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
Ну .. Вы не можете.
Как бы вы решили, что «5» подразумевается как строка или целое число? Как бы вы решили, что «20100120» подразумевается как целое число или дата?
Вы, конечно, могут сделать образованные догадки и реализовать какой-то порядок анализа. Сначала попробуйте как дату, затем в качестве поплавка, а затем как int, и, наконец, как строка.