2016-10-18 3 views
3
처리

여러 개의 텍스트 내가 그과 같이 보이지만, 열 이름의 관점에서 다를 수 있습니다 구문 분석해야 할 파일, 위의 해시 태그의 길이가있는 경우 : txt.file파이썬 : 팬더, 간격 열 이름

을 이것을 판다 데이터 프레임으로 바꾸려면 어떻게해야할까요? 나는 pd.read_table('file.txt', delim_whitespace = True, skiprows = 14)을 사용해 보았지만 모든 종류의 문제가 있습니다. 내 문제는 ...

상단의 모든 텍스트, 별표 및 파운드는 무시해야하지만 모든 스팸 행 위쪽의 크기가 다른 행의 길이와 다를 수 있으므로 건너 뛰기 행을 사용할 수 없습니다. 파일.

"stat (+/-)"및 "syst (+/-)"열은 공백으로 인해 4 열로 표시됩니다.

1 파운드 기호가 열 이름에 포함되어 있으므로 원하지 않습니다. 텍스트 파일에서 텍스트 파일까지 다양하기 때문에 수동으로 열 이름을 지정할 수는 없습니다.

많은 도움이 필요합니다. 팬더를 사용하여 파일을 읽은 후 어디로 가야할 지 잘 모르겠습니다.

+0

마지막 파운드는 살상 문제입니다. 파일 이름을 pandas로 넘겨서는 안됩니다 : 파일 객체를 열고 파운드로 마지막 행을 찾을 때까지 readin, 그 위치의 파일 포인터를 찾은 다음, 데이터의 첫 번째 wor에서 찾을 수있는 크기를 제공하여 read_fwf를 사용하십시오 당신도 그 과정에서 읽습니다. – Boud

+0

마지막 파운드 행까지 읽을 방법에 대해 어떻게 읽습니까? – Destroxia

답변

1

이것은 내가 코멘트에서 언급하고있어 방법이다 : 그것은 당신이 처음에 건너 뛸 필요로하는 사용자 정의 더티 데이터를 생략 할 파일 개체를 사용합니다. 이 단순히 작업을 수행하는 파일의 적절한 위치에 파일 오프셋을 설정합니다.

with open(rawfile, 'r') as data_file: 
    while(data_file.read(1)=='#'): 
     last_pound_pos = data_file.tell() 
     data_file.readline() 
    data_file.seek(last_pound_pos) 
    df = pd.read_fwf(data_file) 

df 
Out[88]: 
    i  mult stat (+/-) syst (+/-)  Q2   x  x.1  Php 
0 0 0.322541 0.018731 0.026681 1.250269 0.037525 0.148981 0.104192 
1 1 0.667686 0.023593 0.033163 1.250269 0.037525 0.150414 0.211203 
2 2 0.766044 0.022712 0.037836 1.250269 0.037525 0.149641 0.316589 
3 3 0.668402 0.024219 0.031938 1.250269 0.037525 0.148027 0.415451 
4 4 0.423496 0.020548 0.018001 1.250269 0.037525 0.154227 0.557743 
5 5 0.237175 0.023561 0.007481 1.250269 0.037525 0.159904 0.750544 
+0

정말 고마워요! 어쨌든 이것을 .LIST 파일로 확장 할 수 있다는 것을 알고 있습니까? – Destroxia

+0

신경 쓰지 마라, 알았다! 도와 줘서 고마워! – Destroxia

2

모듈을 사용하여 새 파일에 쓰는 동안 원시 파일을 한 줄씩 청소하는 것이 좋습니다. 정규식은 일치 기준으로 i을 사용하여 열 머리글을 식별하는 데 사용됩니다. 다음은 하나 개 이상의 공간 컬럼을 분리 가정

import os 
import csv, re 
import pandas as pd 

rawfile = "path/To/RawText.txt" 
tempfile = "path/To/TempText.txt" 

with open(tempfile, 'w', newline='') as output_file: 
    writer = csv.writer(output_file)  

    with open(rawfile, 'r') as data_file: 
     for line in data_file:    
      if re.match('^.*i', line):      # KEEP COLUMN HEADER ROW 
       line = line.replace('\n', '')     
       row = line.split(" ")     
       writer.writerow(row) 

      elif line.startswith('#') == False:   # REMOVE HASHTAG LINES 
       line = line.replace('\n', '') 
       row = line.split(" ")    
       writer.writerow(row) 

df = pd.read_csv(tempfile)         # IMPORT TEMP FILE 
df.columns = [c.replace('# ', '') for c in df.columns]  # REMOVE '#' IN COL NAMES  

os.remove(tempfile)          # DELETE TEMP FILE