Во-первых, вы не можете написать «универсальное» или «умное» преобразование, которое магически обрабатывает что-либо.
Во-вторых, попытка суммировать преобразование строки в данные во что-либо, кроме кода, кажется, никогда не работает хорошо. Поэтому вместо того, чтобы писать строку с именем преобразования, просто запишите преобразование.
Наконец, пытаться написать файл конфигурации на доменном языке глупо. Просто напишите код Python. Это не намного сложнее, чем пытаться разобрать какой-то файл конфигурации.
Возможно или мне нужно заняться чем-нибудь другим?
Не тратьте время на попытки создать "файл типа", который не просто Python. Это не помогает Проще написать преобразование как функцию Python. Вы можете импортировать эту функцию, как если бы это был ваш «файл типа».
import datetime
def convert( row ):
return dict(
id= int(row['id']),
value= str(row['value']),
date= datetime.datetime.strptime(row['date],"%Y-%m-%d %H:%M:%S"),
)
Это все, что у вас есть в вашем "файле типа"
Теперь вы можете читать (и обрабатывать) ваш ввод следующим образом.
from type_file import convert
import csv
with open( "date", "rb" ) as source:
rdr= csv.DictReader( source )
for row in rdr:
useful_row= convert( row )
во многих случаях я не знаю количество столбцов или тип данных до выполнения
Это означает, что вы обречены.
У вас должно быть фактическое определение содержимого файла, или вы не можете выполнять какую-либо обработку.
"id","value","other value"
1,23507,3
Вы не знаете, должно ли "23507" быть целым числом, строкой, почтовым индексом или с плавающей запятой (без учета периода), продолжительностью (в днях или секундах) или какой-либо другой более сложной вещью , Вы не можете надеяться, и вы не можете догадаться.
После получения определения вам нужно написать явную функцию преобразования на основе фактического определения.
После написания преобразования вам нужно (а) проверить преобразование с помощью простого модульного теста и (б) проверить данные, чтобы убедиться, что они действительно преобразуются.
Затем вы можете обработать файл.