2016-11-12 1 views
0

나는 파이썬을 배우고 있으며, 현재 파일을 읽고 줄을 분리 한 다음 특정 요소를 인쇄하는 중이다. 여러 번 분할하는 데 문제가 있습니다. 내가 일하고 파일은 "/ t/n"은 첫 번째 탭과 줄 바꿈에 의해, 내가 그것을 분할하려고이파이썬과 스플릿 공백으로 분할

c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754 

처럼 많은 선이 다음과 요소를 분할 |, 나는 시도 .split 및 .strip과 많은 행운을 가지고 있지 않습니다. 난 그냥 한 줄에 일하면 나는 아래로 생각을하고 (파일

blast_out = ("c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754") 
fields = blast_out.strip(' \t\r\n').split() 
subFields = fields.split("|") 
print(fields) 
print(subFields) 

인쇄 (필드)

['c0_g1_i1|m.1', 'gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO', '100.00', '372', '0', '0', '1', '372', '1', '372', '0.0', '754'] 

인쇄에 액세스 할 루프에 그것을 수정할 수 어쩌면 생각 subFields)는 오류를 생성합니다.

subFields = fields.split('|') 
AttributeError: 'list' object has no attribute 'split' 

이것은 공백과 탭을 제거한 다음 분리하려고 시도한 것입니다. 하지만 아무것도하지 않는 것 같습니다. 결국이 단일 문자열의 원하는 출력은

c0_g1_i1 m.1 Q9HGP0.1 100.0 
+0

'.strip()'은 중복되어'.split()'가 여러분을 대신합니다. –

답변

2

입니다. 이제 별도의 문자열 목록이 있습니다. 마치 입력 형식이 중첩 된 목록을 인코딩하는 것처럼 보입니다. 공백으로 단락 지어진 외부 포맷, 내부는 | 문자로 표시됩니다. 첫 번째 인수로 인수없이 또는 None과 함께합니다 (str.strip()가 완전히 중복이라고

[item.split('|') for item in blast_out.split()] 

참고 str.split() 전화 : 당신은 외부 문자열을 분할 할 수 있습니다

후 지능형리스트에서 다시 각각의 결과 요소를 분할) 이미 선행 및 후행 공백을 제거합니다. 당신이 단순 목록을 예상하는 경우

, 당신은 이해에 또 다른 루프를 추가 할 것 :

[value for item in blast_out.split() for value in item.split('|')] 

내부 목록의 항목 수는 변수의 경우 바람직 할 것이다 전자; 각 공백으로 구분 된 섹션이 시작되거나 끝나는 평면 ​​목록에서 파악하는 것보다 중첩 된 목록의 첫 번째 또는 마지막 요소를 찾는 것이 더 쉽습니다. 다음에 따라, 다음 두 표현 중 하나를 추출 할 수 있습니다 주어진 예를 들어

귀하의 최종 값은 고른 변형 :

(result[0][0], result[0][1], result[1][3], result[2][0]) 

또는

(result[0], result[1], result[5], result[7]) 

데모 :

>>> blast_out = "c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754" 
>>> [item.split('|') for item in blast_out.split()] 
[['c0_g1_i1', 'm.1'], ['gi', '74665200', 'sp', 'Q9HGP0.1', 'PVG4_SCHPO'], ['100.00'], ['372'], ['0'], ['0'], ['1'], ['372'], ['1'], ['372'], ['0.0'], ['754']] 
>>> (_[0][0], _[0][1], _[1][3], _[2][0]) 
('c0_g1_i1', 'm.1', 'Q9HGP0.1', '100.00') 
>>> [value for item in blast_out.split() for value in item.split('|')] 
['c0_g1_i1', 'm.1', 'gi', '74665200', 'sp', 'Q9HGP0.1', 'PVG4_SCHPO', '100.00', '372', '0', '0', '1', '372', '1', '372', '0.0', '754'] 
>>> (_[0], _[1], _[5], _[7]) 
('c0_g1_i1', 'm.1', 'Q9HGP0.1', '100.00') 
+0

정말 고마워요! 이 솔루션은 한 줄로 작동하지만 입력 파일을 반복 할 때 첫 번째 줄 대신 각 줄에 루프를 적용 할 때 몇 가지 문제가 발생합니다. 블래스트 출력의 행에 대해 read() : fields = blast_output.split() blast_output의 항목에 대한 subFields = [item.split ('|')]. print (str (subFields))'같은 줄을 반복해서 인쇄합니다. –

+0

@JamieLeigh : 대상 변수의 이름을'line'으로 지정한 다음 blast_output을 나눕니다. 'fields = blast_output.split()'줄을 사용하지 않아도됩니다. 'subFields = item.split ('|')은 line.split()에서 충분합니다. –

+0

아, 고마워! 지금 제가 당면한 문제는 전체 문서를 한 줄로 변환하고 한 줄에 한 번 인쇄하는 것입니다.하지만 각 줄마다 개별적으로 반복하고 싶습니다. 이해가되는지 모릅니다. 하지만 'line for blast_output :'루프에 문제가있어 각 줄을 나눌 수 있도록 변경할 수 있으며 각 줄의 정보를 개별적으로 출력 할 수 있습니까? –