собственно для выборки чтения из файла csv можно использовать модуль csv (там проблемы с юникодом но вполне решаемые)
код ниже расчитан на работу в 2,7, с юникодом, поэтому функция intern не используется, но при желании вполне можно добавить в метод to_str
в целом бы я организовал нечто подобное:
#!/usr/bin/env python
# -*- coding: utf-8
from __future__ import unicode_literals
from collections import namedtuple
def to_int(element):
"""
Преобразуем строку в число.
ARGUMENTS:
:type element: str | unicode
:rtype: int | long | None
"""
try:
# если числа записаны без кавычек
# return int(element)
# если при числа всегда обрамлёны кавычками
return int(element[1:-1])
# если может быть обрамлён
# return int(element.strip('"'))
except ValueError:
return None
def to_str(element):
"""
обрезаем кавычки
ARGUMENTS:
:type element: str | unicode
:rtype: str | unicode
"""
# если при этом всегда обрамлён кавычками
return element[1:-1]
# если может быть обрамлён
# return element.strip('"')
def to_original(element):
"""
собственно ничего не делаем со строкой
ARGUMENTS:
:type element: str | unicode
:rtype: str | unicode
"""
return element
# предположим что мы не испольщуем модуль csv
# а сами всё считываем построчно из файла
data = {
'"1";"2";"test\"0";"test1";"123"',
'"2";"3";"test1";"test2";"234"',
'"4";"5";"test2";"test3";"345"',
}
# описываем какие колонки нас интересуют, и функции которые будут использоваться при их обработке
column_map = {
0: to_int,
2: to_str,
4: to_original
}
XDR = namedtuple('XDR', 'num, string, other')
#: :type: list[XDR]
xdrs = list()
for row in data:
row_splited = row.split(';')
xdrs.append(XDR(*(func(row_splited[column]) for column, func in column_map.iteritems())))
print xdrs
вывод:
[XDR(num=1, string=u'test"0', other=u'"123"'), XDR(num=2, string=u'test1', other=u'"234"'), XDR(num=4, string=u'test2', other=u'"345"')]