2017-12-20 5 views
0

수백만 줄의 큰 json 파일이 있습니다. 이 파일에도 오류 메시지가 있습니다. 아래는 예입니다팬더를 사용하여 json 라인을 파싱

예상대로
{"MEASUREMENT_1":"12345678","MEASUREMENT_2":"123456789012","MEASUREMENT_3":"MEASUREMENT_TYPE","MEASUREMENT_4":1111111111111,"MEASUREMENT_5":-1122,"MEASUREMENT_6":-2233,"MEASUREMENT_7":"123456789"} 
{"MEASUREMENT_1":"87654321","MEASUREMENT_2":"98","MEASUREMENT_3":"MEASUREMENT_TYPE_2","MEASUREMENT_4":222222222222,"MEASUREMENT_5":-4455,"MEASUREMENT_6":-6677,"MEASUREMENT_7":"123456789"} 
[2015-12-02 02:00:02,530] WARN Reconnect due to socket error: null 
[2015-12-02 02:00:02,633] WARN Reconnect due to socket error: null 

은, 아래의 코드 때문에 파일에 오류 메시지 라인의 ValueError가 발생합니다.

max_records = 1e5 
df = pd.read_json(file, lines=True, chunksize=max_records) 
filtered_data = pd.DataFrame() # Initialize the dataframe 
try: 
    for df_chunk in df: 
     filtered_data = pd.concat([filtered_data, df_chunk]) 
except ValueError: 
     print ('\nSome messages in the file cannot be parsed') 

그러나 위의 방법의 단점은 라인의 일부를 벗어났습니다입니다 :이로

#!/usr/bin/python3.5 
import pandas as pd # Version 0.21.0 
df = pd.read_json(file, lines=True) 

나는 chunksize 사용하고 같은 아래 expection는 매우 큰 파일입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_json.html의 문서를 살펴 보았지만 해석되지 않은 행을 무시할 수있는 항목을 찾을 수 없습니다. 누군가 도울 수 있습니까?

+0

이 줄을 제거하는 것이 가능한가? –

+0

각 "측정"이 자체 json 객체 인 것처럼 보이므로 파일에 json 객체가 많고 그 중 하나가 많아서 실패 할 수 있습니다. –

+0

for 루프의 각 반복 안에 try 블록이 아닌 try 블록 내부에 for 루프가있는 이유는 무엇입니까? – Acccumulation

답변

0

마지막으로 파일에서 오류 메시지를 제거하는 해결책을 찾았습니다. 그러나이 절차는 파일을 정리하는 데 추가 시간을 추가하고 새 파일로 저장합니다.

#!/usr/bin/python3.5 

    import re 
    import pandas as pd # Version 0.21.0 

    def clean_data(filename): 
     with open(filename, "r") as inputfile: 
      for row in inputfile: 
       if re.match("\[", row) is None: 
        yield row 

    with open(clean_file, 'w') as outputfile: 
     for row in clean_data(filename): 
      outputfile.write(row) 

    max_records = 1e5 
    df = pd.read_json(clean_file, lines=True, chunksize=max_records)