2016-07-14 2 views
2

Я только что присоединился к вам после прочтения тонны информации за последние несколько месяцев, так как я получаю основания с Python.Python CSV найти строку и передать номер столбца переменной

Во всяком случае, я очень новичок и занимаюсь исследованиями, насколько это возможно, но большинство ответов немного из моих досягаемости в понимании и, похоже, не делают именно то, что мне нужно.

Из чтения, которое я сделал, я не уверен, должен ли я познакомиться с Panda или нет, но мне в основном нужно сделать простое форматирование, преобразование и реорганизацию файла ALE. ALE - это простой файл списка с разделителями табуляции, содержащий имена и метаданные видеороликов. Заголовки расположены в строке 8 и данные контента на 11 и вниз. Вот пример:

1 Heading 
2 FIELD_DELIM TABS 
3 VIDEO_FORMAT 1080 
4 AUDIO_FORMAT 48khz 
5 FPS 23.976 
6 
7 Column 
8 #### COLUMN HEADERS #### 
9 
10 Data 
11 #### TAB DELIMITED DATA #### 

На данный момент мы предполагаем, что мои входные файлы были отформатированы раздеться строки 1-7, 9 и 10, так что мы просто имеем строку заголовка в строке 1, а данные начинается строка 2.

Моя первая задача с этой программой - преобразовать весь столбец данных в новый формат, который я правильно работаю, но только если я нацелен на столбец, который я ищу в наборе данных, который не имеет заголовков.

for row in ale_file: 
    row[3] = timecode_to_frames(row[3]) 
    print row 

Проблема заключается в том, я не всегда знаю, что столбец чисел существует данные в (так как каждая программа будет выводить метаданные в различных порядках), но я знаю, что имя заголовка. Как-то мне нужно прочитать строку заголовка, и когда он найдет три заголовка с именем «start», «end» и «duration», он передаст эти номера столбцов в переменную. Затем в цикле for выше я мог бы запустить функцию timecode_to_frames в номерах строк, соответствующих заголовкам.

Я считаю, что это должно быть довольно просто вдоль этих линий (простите меня, если я ужасно выключен):

for row in ale_file: 
    for col in row: 
     if col == 'start': 
      start_col = ##column number## 

Тогда в мой существующий код, который я мог бы назвать переменную:

for row in ale_file: 
    row[start_col] = timecode_to_frames(row[start_col]) 
    print row 

Замечание: В моем цикле FOR мне нужно явно пропускать строку 1, поскольку это просто заголовок, так как он не будет иметь правильно отформатированные данные, ожидаемые функцией. Возможно, гнездится цикл for в цикле while, например while row != 0: или что-то в этом роде?

Любая помощь была бы принята с благодарностью, спасибо!

+1

Получить строку заголовка в переменную. Затем 'start_col = header.split ('\ t'). Index ('start')', 'end_col = header.split ('\ t'). Index ('end')' и т. Д. – leekaiinthesky

ответ

1

Если все, что вам нужно, это columnHeader вместе с соответствующим значением columnValue, вы можете прочитать первую строку (заголовок) перед циклом из файла, а внутри цикла использовать zip (header, row), чтобы получить кортеж (columnHeader, columnValue).

https://docs.python.org/2/library/functions.html#zip

0

Похоже, что вам нужно numpy.genfromtxt() с delimiter='\t' и names=True

Look here

Вы можете установить генератор для возврата строк, а затем переформатировать столбцы на основе имени (которое он будет тянуть с вашим заголовки столбцов).

import numpy as np 
output=np.genfromtxt(ale_file, dtypes='S8', names=True, delimiter='/t')[['start','end','duration']] 
#output['start'].dtype='foo'       #if it's an included dtype 
#output['start']=timecode_to_frames(output['start']) #if not 

Нет для задействованных петель!

Смежные вопросы