2013-12-22 2 views
1

텍스트 파일에 오른쪽 정렬 된 열로 분리 된 데이터가 있습니다. 기본적으로 배열과 마찬가지로 각 열을 가져 와서 목록에 넣을 수 있기를 원합니다. 나는 보통 작업을 수행하기 위해 VB에서 사용하는 것처럼파이썬은 별도의리스트로 라인을 분할합니다.

left(strname,#ofcharacters)/mid(strname,firstcharacter,lastcharacter)/right(strname,#ofcharacters) 

과 같은 것을 찾을 수 없습니다. 어떻게 데이터를 분리하고 각각의 '단위'를 파이썬의 다음 라인의 값과 함께 두는가?

가능합니까? 오, 예, 간격은 12 문자 떨어져 (오른쪽 정렬) 다른 문자는 15 문자 간격입니다.

-1234  56 32452  68584.4 Extra_data 
-5356  9  546  12434.5 Extra_data 
- 90  12  2345  43522.1 Extra_data 

원하는 출력 :

[-1234, -5356, -90] 
[56, 9, 12] 
[32452, 546, 2345] 
etc 
+1

문자열을 제시해주십시오. –

+0

질문을 업데이트하여 파일이 어떻게 생겼는지, 어떻게 출력되어야하는지, 일명 어떻게 구성해야하는지 등의 아이디어를 포함시킵니다. – confused

답변

0

당신이 찾고있는 파이썬에서 이에 해당하는 방법은 공백에서 문자열을 분할 인수없이 str.split()입니다. 또한 뒤 따르는 줄 바꿈/공백을 처리하고 VB 예제 에서처럼 데이터 너비를 신경 쓸 필요가 없습니다.

with open("data.txt") as fin: 
    data = map(str.split, fin) #Split each line of data on white-spaces 
    data = zip(*data) #Transpose the Data 

하지만 공백으로 열이있는 경우, 당신은 열 위치를 기반으로, 일부는 데이터를 분할해야

>>> def split_on_width(data, pos): 
    if pos[-1] != len(data): 
     pos = pos + (len(data),) 
    indexes = zip(pos, pos[1:]) #Create an index pair with current start and 
           #end as next start 
    return [data[start: end].strip() for start, end in indexes] #Slice the data using 
                   #the indexes 

>>> def trynum(n): 
    try: 
     return int(n) 
    except ValueError: 
     pass 
    try: 
     return float(n) 
    except ValueError: 
     return n 


>>> pos 
(0, 5, 13, 22, 36) 
>>> with open("test.txt") as fin: 
    data = (split_on_width(data.strip(), pos) for data in fin) 
    data = [[trynum(n) for n in row] for row in zip(*data)]  


>>> data 
[[-1234, -5356, -90], [56, 9, 12], [32452, 546, 2345], [68584.4, 12434.5, 43522.1], ['Extra_data', 'Extra_data', 'Extra_data']] 
0

그냥 인수없이 str.split()를 사용; 공백을 포함하는 모든 컬럼 또한 분할 될 것이라고

>>> ' some_value another_column 123.45  42 \n'.split() 
['some_value', 'another_column', '123.45', '42'] 

주 : 임의의 폭에서 공백 입력 문자열을 분할한다.

당신이 , 당신은 행을 바꾸어해야하는 경우 목록이하고 싶었다면 :

with open(filename) as inputfh: 
    columns = zip(*(l.split() for l in inputfh))