2013-06-10 4 views
1

Я очень новичок в python, и, пройдя некоторые упражнения, я подумал, что было бы неплохо написать мою первую программу! (Возможно, слишком амбициозная цель).Как выполнить несколько функций в текстовом файле

У меня есть текстовый файл и вы хотите извлечь из него несколько фрагментов информации. Текстовый файл является выходным файлом из программного обеспечения для доставки стимулов и расположен в столбцах и строках.

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

Например, из следующего текста:

RXXXX 9 Picture CATCH_QUAIL_600_5_3000_2590_278 1026069 7999 2 3000 3 7900 2960 other 0 

RXXX 9 Picture poststim_fixation 1029236 0 1 25997 2 0 25900 other 0 

RXXXX 9 Response 115 1036879 7643 1 

Хочу сообщить, что было ответом на пробный номер 9 и что ответ был для картины «CATCH_QUAIL».

Я думаю, что лучший способ сделать это - программа, чтобы найти строку «Ответ», а затем извлечь информацию из двух строк выше и из одного столбца влево.

Итак, это то, что я до сих пор (я извиняюсь его жалким):

x= open('file') 
    y= x.read() 
    y.split() 
    l= y.splitlines() 

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

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

Просмотрев некоторые другие вопросы здесь, я сожалею, если это намного ниже калибровки вопроса, который вы ожидаете, но я не уверен, куда еще обратиться!

Спасибо,

Бен

+0

Как вы связываете ответ на картинке? Из вашего примера кажется, что ответ для «poststim_fixation», а не «CATCH_QUAIL ..» – Dhara

+0

1. 'y.split()' - почему вы отбрасываете возвращаемое значение? Эта строка в настоящее время ничего не делает (кроме использования процессорного времени). Ну, splitlines() - это то, что вы действительно хотите сделать, так что убивайте эту строку. 2. Вам нужен только один цикл (найдите 'enumerate()' help и посмотрите, можете ли вы понять, почему). 3. Вы можете использовать «in» (как в «Response» в этой строке »), чтобы проверить, содержит ли строка другую строку. – kampu

+0

@kampu большое спасибо, теперь у меня будет игра с этим. – Ben

ответ

0

Обычно питона документы являются хорошим местом для начала, проверьте раздел на reading/writing files. Упомянутый есть очень полезная модель для работы с файлами в Python:

#!/usr/bin/env python 
with open("file", "r") as my_file: 
    for i, my_line in enumerate(my_file): 
    print i, my_line 

Это позволит открыть файл (my_file) для чтения (опция "r"), а затем просто распечатать каждую строку (my_line) и его положение (i) для тебя.

Второй полезный шаблон здесь является enumerate() во второй строке сценария Это занимает список, и для каждого элемента дает вам обратно деталь, и это «индекс» или позицию в списке.Так, например:

for index, item in enumerate(["a", "b", "c"]): 
    print index, ":", item 

дает:

0 : a 
1 : b 
2 : c 

Хорошо, теперь вы можете рассмотреть вопрос об использовании in ключевого слова для поиска подстроки "Response" в строке:

if "Response" in my_line: 
    print "found Response in line %s!" % i 

попробуйте запустить все это и посмотреть, что вы получаете

with open("py-test.txt", "r") as my_file: 
    for i,my_line in enumerate(my_file): 
    print i, my_line 
    if "Response" in my_line: 
     print "found Response in line %s!" % i 

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

+0

Спасибо за подробный ответ msturdy, тупо, я только вернулся, чтобы посмотреть на любые комментарии сейчас и на самом деле сделал это по-другому! Но вы правы, раздел «Чтение и запись файлов» очень полезен, поэтому благодарим вас за указание на это. – Ben

+0

Рад помочь! шаблон 'with' - это то, о чем я хотел бы знать некоторое время назад :) – msturdy

0

Я бы прочитать информацию из файла и поместить его в список-из-списков, как это:

data = [] 
with open('textfile.txt') as inputfile: 
    for line in inputfile.read().splitlines(): 
     if line: 
      data.append(line.split()) 
print data 

Результат:

[['RXXXX', '9', 'Picture', 'CATCH_QUAIL_600_5_3000_2590_278', '1026069', '7999', '2', '3000', '3', '7900', '2960', 'other', '0'], 
['RXXX', '9', 'Picture', 'poststim_fixation', '1029236', '0', '1', '25997', '2', '0', '25900', 'other', '0'], 
['RXXXX', '9', 'Response', '115', '1036879', '7643', '1']] 

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

for i, line in enumerate(data): 
    if line[2] == 'Response': 
     print 'Got response on trial numder', line[1] 
     if data[i-2][2] == 'Picture' and data[i-2][3].startswith('CATCH_QUAIL'): 
      print ' The response was for the picture', data[i-2][3] 

Выходные:

Got response on trial numder 9 
    The response was for the picture CATCH_QUAIL_600_5_3000_2590_278 
+0

Спасибо за совет Martineau – Ben

1

Благодаря всем вам за помощь. Я думаю, что ясно, что есть много способов сделать это: ниже код, к которому я пришел, - это, вероятно, не самый аккуратный, но я считаю его достаточно прозрачным и легким в обращении.

x= open('file') 
logs=x.readlines() 
iLine = logs[6] 

log_enumerater = enumerate(logs) 
for iLine in log_enumerater: 
    if iLine[1].find('CATCH') != -1: 
      Event=iLine[1].split('\t')[3] 
      word=Event.split('_')[1] 
      t0=int(iLine[1].split('\t')[4]) 
      print iLine[1].split('\t')[3].split('_')[1], iLine[0] 
      print 'Catch in line ', iLine[0] 
      myLine = int(iLine[0])+2 
      print 'Response in Line', myLine 
    if iLine[1].find('Response') != -1: 
      t1= int(iLine[1].split('\t')[4]) 
      ResponseTime= t1-t0 
      print ResponseTime 

Я использовал его для получения пробных номеров и теперь немного адаптировал его для получения времени отклика.

Еще раз спасибо за вашу помощь,

Бен

+0

Вы можете сделать свой код немного более читаемым, изменив цикл' for' на 'для i, строка в log_enumerater : 'и затем изменить ваши ссылки на' iLine [0] 'только на' i' и 'iLine [1]' на 'line'.Также вместо 'if iLine [1] .find ('CATCH')! = -1:' вы могли бы использовать 'if 'CATCH' в iLine [1]:' (или 'if 'CATCH' в строке:' если вы я следовал моему первому предложению). То же самое для строки 'if iLine [1] .find ('Response')! = -1:'. – martineau

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