2013-06-10 3 views
1

저는 파이썬에 매우 익숙하며 몇 가지 실습을 통해 처음 프로그램을 작성하는 것이 좋습니다. (아마도 지나치게 야심 찬 목표).텍스트 파일에 여러 함수를 수행하는 방법

나는 텍스트 파일을 가지고 있으며 거기에서 몇 가지 정보를 추출하려고합니다. 텍스트 파일은 자극 전달 소프트웨어의 출력 파일이며 열과 행으로 정렬되어 있습니다.

프로그램에서 특정 문자열이 몇 번이나 기록되었는지를 기록한 다음 파일의 주변 텍스트에서 다른 두 가지 정보도 기록하도록합니다. 다음 텍스트에서 예를 들어

:

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

을 주셔서 감사합니다? 당신의 예제에서, 응답은 "CATCH_QUAIL .."보다는 "poststim_fixation"에 대한 것 같습니다. – Dhara

+0

1.'y.split()'- 리턴 값을 버리는 이유는 무엇입니까? 이 줄은 현재 아무 것도하지 않습니다 (CPU 시간 사용 제외). 음, splitlines()는 어쨌든 정말로하고 싶어하는 것이므로 그 줄을 없애십시오. 2. 하나의 루프 만 필요합니다 ('enumerate()'도움말을보고 왜 도움을 얻을 수 있는지보십시오). 3. 'in'을 사용하여 문자열에 다른 문자열이 들어 있는지 테스트 할 수 있습니다. – kampu

+0

@kampu 대단히 감사합니다, 나는 지금 그걸 가지고 놀 것입니다. – Ben

답변

0

일반적으로 파이썬 문서는 시작 reading/writing files에 섹션을 확인하기에 좋은 장소입니다. 파이썬에서 파일 작업을위한 매우 유용한 패턴이 언급 :

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

이 (옵션 "r")를 읽는 파일 (my_file)를 열고 단지 각 라인 (my_line) 및 위치를 인쇄합니다이 (i).

여기에 두 번째 유용한 패턴

는이 목록을 소요 스크립트의 두 번째 줄에있는 enumerate()이며, 각 항목에 대해 당신이 항목을 다시 제공하고,이 목록에서 "인덱스"또는 위치입니다.따라서, 예를 들어 :

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

을 제공합니다

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

0 : a 
1 : b 
2 : c 

좋아, 지금은 라인 내에서 문자열 "응답"을 검색 할 in 키워드를 사용하는 것을 고려 할 수 있습니다

모든 것을 실행하여 얻은 결과 확인

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, stupidly 나는 단지 지금 어떤 코멘트를 보러 돌아 왔고 다른 방법으로 실제로했습니다! 그러나 당신은 정확합니다, 읽기 및 쓰기 파일 섹션은 매우 도움이됩니다. 그래서 저를 위해 그것을 지적 해 주셔서 감사합니다. – 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' 루프를'for, log_enumerater 라인으로 변경하여 코드를 좀 더 읽기 쉽게 만들 수 있습니다 :'그리고 나서'iLine [0]'에 대한 참조를'i'로,'iLine [1]'을'line'으로 변경하십시오.if iLine [1] .find ('CATCH')! = -1 : iLine [1]에서'CATCH '를 사용할 수 있습니다 :'(또는'CATCH'가'if 내 첫 제안을 따라 갔다.) if iLine [1] .find ('Response')! = -1 :'행과 동일합니다. – martineau

관련 문제