В вашем коде есть несоответствие:
если все элементы в списке являются строками, вы не можете написать datetime(x)
, если x - строка
edit
Это ничего не изображает, так как это неуместно.Сложность того, чего нет в вашем коде, не оправдывает странности, которые есть в вашем коде.Пока вы не будете объяснять, как вы можете передать строку в качестве аргумента функции datetime.datetime () , никто не сможет вам помочь, ИМО.
Редактировать
Я думаю, что лучше создать непосредственно ваш список в момент чтения файла.
Я написал пример:
.
Сначала я создалCSV-файл со следующим кодом:
import csv
from random import randint,choice
from time import gmtime
xx = ['Whose', 'all', 'birth', 'just', 'infant', 'William',
'dearest', 'rooms', 'find', 'Deserts', 'saucy', 'His',
'how', 'considerate', 'only', 'other', 'Houses', 'has',
'Fanny', 'them', 'his', 'very', 'dispense', 'early',
'words', 'not', 'thus', 'now', 'pettish', 'Worth']
def gen(n):
for i in xrange(n):
yield ['AAAA','%d/%02d/%02d %02d:%02d:%02d' % gmtime(randint(0,80000000))[0:6],'@@@']
yield ['BBBB',randint(100,999),'^^^^^^']
yield ['CCCC',choice(xx),'-----------------']
with open('zzz.txt','wb') as f:
writ = csv.writer(f, delimiter='#')
writ.writerows(x for x in gen(60))
Структура CSV-файла такова:
AAAA#1972/02/11 08:53:53#@@@
BBBB#557#^^^^^^
CCCC#dearest#-----------------
AAAA#1971/10/15 06:55:20#@@@
BBBB#668#^^^^^^
CCCC#?#-----------------
AAAA#1972/07/13 11:10:05#@@@
BBBB#190#^^^^^^
CCCC#infant#-----------------
AAAA#1971/11/22 19:31:42#@@@
BBBB#202#^^^^^^
CCCC##-----------------
AAAA#1971/06/12 05:48:39#@@@
BBBB#81#^^^^^^
CCCC#find#-----------------
AAAA#1970/12/09 06:26:29#@@@
BBBB#72#^^^^^^
CCCC#find#-----------------
AAAA#1972/07/05 10:45:32#@@@
BBBB#270#^^^^^^
CCCC#rooms#-----------------
AAAA#1972/06/23 05:52:20#@@@
BBBB#202#^^^^^^
CCCC##-----------------
AAAA#1972/03/21 23:06:47#@@@
BBBB#883#^^^^^^
CCCC#William#-----------------
...... etc
.
Следующий код извлекает данные ваналогично тому, что вы хотите.
Нет необходимости в словаре, достаточно кортежа.Учитывая структуру созданного CSV-файла, я определил funcs = 60 * (to_dt, int, lambda x: x)
, но вы будете использовать последовательность функций, которые являются значениями вашего словаря (отсортированы)
import re
import csv
from datetime import datetime
from itertools import izip
reg = re.compile('(\d{4})/(\d\d)/(\d\d) (\d\d):(\d\d):(\d\d)')
def to_dt(x, error_data = ('', ' ', '?')):
if x in error_data:
return x
else:
return datetime(*map(int,reg.match(x).groups()))
def teger(x, error_data = ('', ' ', '?')):
if x in error_data:
return 0
else:
return int(x)
funcs = 60 * (to_dt, int, lambda y: y)
with open('zzz.txt','rb') as f:
rid = csv.reader(f, delimiter='#')
li = [fct(x[1]) for fct,x in izip(funcs,rid)]
# display
it = (str(el) for el in li).next
print '\n'.join('%-21s %4s %10s' % (it(),it(),it()) for i in xrange(60))
result
1972-02-11 08:53:53 557 dearest
1971-10-15 06:55:20 668 ?
1972-07-13 11:10:05 190 infant
1971-11-22 19:31:42 202
1971-06-12 05:48:39 81 find
1970-12-09 06:26:29 72 find
1972-07-05 10:45:32 270 rooms
1972-06-23 05:52:20 202
1972-03-21 23:06:47 883 William
1970-02-08 23:47:26 617
1970-10-08 09:09:33 387 William
1971-04-30 11:05:07 721 ?
1970-02-12 11:57:48 827 Deserts
1972-03-27 21:30:39 363 just
1971-06-02 00:23:52 977
1970-04-20 04:38:38 113 William
1971-01-20 23:10:26 75 Whose
1971-07-01 12:46:13 352 dearest
1971-01-31 17:01:34 220 William
1970-06-09 20:38:52 148 rooms
1971-08-08 07:42:10 146
1970-01-28 15:17:41 903 find
...............etc