Я пытался найти хороший и гибкий способ синтаксического анализа файлов CSV в Python, но ни один из стандартных вариантов, кажется, не отвечает всем требованиям.Я испытываю желание написать свой собственный, но я думаю, что некоторая комбинация того, что существует в numpy / scipy и модуле csv, может делать то, что мне нужно, и поэтому я не хочу изобретать велосипед.
I 'Мне понравились стандартные возможности определения разделителей, определения наличия или отсутствия заголовка, количества пропускаемых строк, разделителя комментариев, игнорируемых столбцов и т. д. Основная функция, которую мне не хватает, - это возможность разбирать файлы CSV вспособ, который изящно обрабатывает как строковые данные, так и числовые данные.Многие из моих CSV-файлов имеют столбцы, которые содержат строки (не обязательно одинаковой длины) и числовые данные.Я хотел бы иметь возможность использовать массив массивов для этих числовых данных, а также иметь доступ к строкам.Например, предположим, что мой файл выглядит следующим образом (представьте, что столбцы разделены табуляцией):
# my file
name favorite_integer favorite_float1 favorite_float2 short_description
johnny 5 60.2 0.52 johnny likes fruitflies
bob 1 17.52 0.001 bob, bobby, robert
data = loadcsv('myfile.csv', delimiter='\t', parse_header=True, comment='#')
Я бы хотел иметь доступ к данным двумя способами:
Как матрица значений: для меня важно получить массив numpy.array, чтобы я мог легко перемещать и получать доступ к столбцам, которые являются числовыми.В этом случае я хочу иметь возможность сделать что-то вроде:
floats_and_ints = data.matrix
floats_and_ints[:, 0] # access the integers
floats_and_ints[:, 1:3] # access some of the floats
transpose(floats_and_ints) # etc..
Как объект, подобный словарю, где мне не нужно знать порядок заголовков: я бы хотел также получить доступ к данным по порядку заголовков.Например, я хотел бы сделать:
data['favorite_float1'] # get all the values of the column with header
"favorite_float1"
data['name'] # get all the names of the rows
Я не хочу знать, чтоfavour_float1 - это второй столбец в таблице, поскольку это может измениться.
Для меня также важно иметь возможность перебирать строки и обращаться к полям по имени.Например:
for row in data:
# print names and favorite integers of all
print "Name: ", row["name"], row["favorite_int"]
Представление в (1) предлагает numpy.array, но, насколько я могу судить, это плохо работает со строками и требует от меня указания типа данных заранееа также метки заголовков.
Представление в (2) предлагает список словарей, и это то, что я использовал.Тем не менее, это действительно плохо для файлов CSV, которые имеют два строковых поля, но остальные столбцы являются числовыми.Для числовых значений вы действительно хотите когда-нибудь получить доступ к матричному представлению и манипулировать им как numpy.array.
Существует ли комбинация функций csv / numpy / scipy, которая обеспечивает гибкостьобоих миров?Любой совет по этому поводу будет принята с благодарностью.
Таким образом, основные функции:
- Стандартная возможность указывать разделители, количество пропускаемых строк, игнорируемых столбцов и т. Д.
- Возможность получения numpy.array / матричного представления данных для обработки числовых значений.
- Возможность извлекать столбцы и строки по имени заголовка (как показано выше).пример)