ВАМ НЕ НУЖНО ВЫРАЖАТЬ ЗАЯВЛЕНИЯ ТИПА !!!
Вы можете получить то, что вы хотите непосредственно из файлов .dbf. У каждого столбца есть имя, код типа (C = символ, N = число, D = дата (ггггммдд), L = логический (T / F), плюс дополнительные типы, если файлы взяты из Foxpro), длина (при необходимости) ) и количество десятичных знаков (для типа N).
Какое бы программное обеспечение вы не использовали для извлечения данных из файлов .dbf, оно было необходимо для использования этой информации для преобразования каждого фрагмента данных в соответствующий тип данных Python.
Словари? Зачем? При небольшом объеме работы это программное обеспечение может быть модифицировано для создания оператора CREATE TABLE на основе этих определений столбцов, а также оператора INSERT для каждой строки данных.
Полагаю, вы используете один из нескольких опубликованных модулей Python для чтения DBF. Любой из них должен иметь необходимые вам средства: открыть файл .dbf, получить имена столбцов, получить тип столбца и т. Д., Получить каждую строку данных. Если вы недовольны используемым модулем, поговорите со мной; У меня есть неопубликованный документ, который в части чтения DBF объединяет лучшие функции других, избегает худших функций, настолько же быстр, как вы получите с чистой реализацией Python, обрабатывает все типы данных Visual Foxpro и псевдо _NullFlags -колонна, обрабатывает заметки и т. д. и т. д.
НТН
=========
Приложение:
Когда я сказал, что вам не нужно выводить типы, вы не дали понять, что у вас есть набор полей типа C, которые содержат числа.
Поля FIPS: некоторые с, а некоторые без начальных нулей. Если вы собираетесь их использовать, вы столкнетесь с проблемой «012»! = «12»! = 12. Я бы предложил удалить ведущие нули и сохранить их в целочисленных столбцах, восстановить ведущие нули в отчетах или что-то еще, если вам действительно нужно. Почему существует 2 штаты Фипса и Фипа?
Население: в файле примера почти все целые числа. Четыре - как 40552.0000, а разумное число - пустое / пустое. Вы, кажется, считаете население важным и спрашиваете: «Возможно ли, что небольшой процент полей населения содержит ....?» Все возможно в данных. Не удивляйтесь и не размышляйте, исследуйте! Я настоятельно рекомендую вам отсортировать данные в порядке популяции и просмотреть их; Вы обнаружите, что несколько мест в одном штате имеют одинаковое количество населения. Например. В штате Нью-Йорк есть 35 мест, чей pop'n указан как 8 008 278; они распределены по 6 округам. 29 из них имеют значение PL_FIPS 51000; 5 имеют 5100 - выглядит как проблема с завершающим нулем: - (
Совет для выбора между float и int: try anum = float (chars) first ; если это удастся, проверьте, если int (anum) == anum.
ID: замечательный «уникальный ID»; 59 случаев, когда это не int - несколько в Канаде (на веб-сайте говорилось «города США»; это артефакт какого-то неразрешенного пограничного спора?), Некоторые содержали слово «Number», а некоторые пустые.
Низко висящий фрукт: я бы подумал, что на самом деле целое число было целым на 0,1 дюйма над землей: -)
В этом есть серьезный недостаток, если все ([int (значение) ... логика:
)
>>> all([int(value) for value in "0 1 2 3 4 5 6 7 8 9".split()])
False
>>> all([int(value) for value in "1 2 3 4 5 6 7 8 9".split()])
True
>>>
Вы, очевидно, думаете, что тестируете, что все строки можно преобразовать в int, но вы добавляете райдера "и все они ненулевые". То же самое всплывают через несколько строк.
IOW, если есть только одно нулевое значение, вы объявляете, что столбец не является целым числом.
Даже после исправления, если есть только одно пустое значение, вы называете его varchar.
Я предлагаю следующее: посчитать, сколько пустых (после нормализации пробела (которое должно включать NBSP)), сколько квалифицируется как целое число, сколько нецелых непустых - как число с плавающей запятой, и сколько «других». Проверьте «другие»; решить, следует ли отклонить или исправить; повторяй пока не доволен: -)
Я надеюсь, что это поможет.