2017-02-09 2 views
0

pandas read_csv에서 예를 들어 지정할 수있는 방법이 있습니다. col1, col15, wholeline?pandas 데이터 프레임 read_csv, 열을 지정하고 전체 줄을 문자열로 유지

'^'가 구분 기호로 사용되며 텍스트 한정자와 캐리지 리턴이 줄 구분 기호로 사용되는 텍스트 파일에서 약 700000 개의 데이터 행을 가져 오려고합니다.

텍스트 파일에서 필자는 1 열 15 열을 필요로하고 테이블/데이터 프레임의 3 열에 전체 줄이 필요합니다.

나는 팬더에서 이것을하는 방법을 연구했지만 논리를 이해할만큼 잘 모릅니다. 26 열 모두를 제대로 가져올 수는 있지만 문제가 해결되지 않습니다.

my_df = pd.read_csv("tablefile.txt", sep="^", lineterminator="\r", low_memory=False) 

표준 파이썬을 사용하여 데이터를 테이블에 넣을 수 있지만 700000 행의 경우 약 4 시간이 소요됩니다. 그것은 나를 위해 너무 길다.

count_1 = 0 
for line in open('tablefile.txt'): 
    if count_1 > 70: 
     break 
    else: 
     col1id = re.findall('^(\d+)\^', line) 
     col15id = re.findall('^.*\^.*\^(\d+)\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*', line) 
     line = line.strip() 

     count_1 = count_1 + 1 

     cur.execute('''INSERT INTO mytable (mycol1id, mycol15id, wholeline) VALUES (?, ?, ?)''', 
     (col1id[0], col15id[0], line,)) 

     conn.commit() 
    print('row count_1=',count_1) 

팬더 read_csv에서, 예를 지정하는 방법이있다. col1, col15, wholeline?

상기에서와 같이, col1col15이 자리하고 wholeline 문자열 내가 그 과정에서 일부 문자가 손실 될 수 있습니다로 가져온 후 문자열을 다시하고 싶지 않아

  • 입니다.

감사

편집

: 각 라인에 대한 데이터베이스에 커밋 는 연소 시간이었다.

+0

파이썬 만 사용하는 경우 루프 외부에서 정규 표현식을 한 번 컴파일해야합니다. 이것은 일을 가속화해야합니다 –

+0

이것이 어떻게 작동하는지 이해하지 못합니다. re.findall (regex, object) re.findall을 호출하기 전에 필요한 객체를 작성해야한다고 생각했습니다. 당신은 모범이 있습니까? – CArnold

답변

0

그들을 구문 분석을 피하기 위해 정규 표현식을 컴파일 할 수 있습니다. 로드 시간을 몇 분으로 줄였습니다. 덜 안전하다고 생각합니다.

어쨌든 도움 주셔서 감사합니다.

1

일부 준 분리 기호 (아래사용)를 사용하여 전체 줄을 하나의 df로 읽은 다음 usecols로 다시 읽은 다음 1과 15 열의 색인을 지정하고 함께 추가하십시오.

my_df_full = pd.read_csv("tablefile.txt", sep="&", lineterminator="\r", low_memory=False) 
my_df_full.columns = ['full_line'] 

my_df_cols = pd.read_csv("tablefile.txt", sep="^", lineterminator="\r", low_memory=False, usecols=[1,15]) 

my_df_full[['col1', 'col15']] = my_df_cols 
+0

텍스트에없는 구분자를 찾는 것은 어렵지만, 계속해서 살펴 보겠습니다. – CArnold

+0

@CArnold 분리 기호를 찾지 못하면 모든 열을 연결할 수 있지만 약간 지루하지만 작동해야합니다. 이것을보십시오 : http://stackoverflow.com/questions/19377969/combine-two-columns-of-text-in-dataframe-in-pandas-python. 그것은 작동하는지 모르겠지만'low_memory = False'를 제거하고 분리 자로 문자열을 사용하려고 할 수도 있습니다. 'sep = "c_arnold_pandas"' –

1

첫째, 당신은 내가 루프의 외부에 conn.commit()를 넣어 각 라인

import re 

reCol1id = re.compile('^(\d+)\^') 
reCol15id = re.compile('^.*\^.*\^(\d+)\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*\^.*') 

count_1 = 0 
for line in open('tablefile.txt'): 
    if count_1 > 70: 
     break 
    else: 
     col1id = reCol1id.findall(line)[0] 
     col15id = reCol15id.findall(line)[0] 
     line = line.strip() 

     count_1 += 1 

     cur.execute('''INSERT INTO mytable (mycol1id, mycol15id, wholeline) VALUES (?, ?, ?)''', 
     (col1id, col15id, line,)) 

     conn.commit() 
    print('row count_1=',count_1) 
관련 문제