Twitter API로 얻은 데이터를 CSV 형식으로 저장할 때 개행 코드에주의하십시오.

소개



Twitter API 로 취득한 데이터를 CSV 파일에 보존했을 때에, 개행 코드 때문에 고생했기 때문에 메모.

환경



우분투 18.04.2
Anaconda 3 5.3.1
파이썬 3.7
Jupyter Notebook

문제



Twitter API로 얻을 수 있는 데이터 의 중, textfull_textuser->description 라고 하는 요소는, 유저가 스스로 문장을 입력한 데이터가 되므로, 개행 코드가 포함되는 경우가 있습니다.

개행 코드에는 \n\r\r\n 의 3 종류가 있습니다만 , Twitter 유저가 사용하고 있는 환경에 의해 , 그 종류가 바뀌어 버립니다 (참고 : 개행 코드 일람 ).

예를 들어 트윗의 text 데이터에는
メッセージ\nメッセージ\nメッセージ
メッセージ\rメッセージ\rメッセージ
メッセージ\r\nメッセージ\r\nメッセージ

의 3 종류가 포함됩니다.

그런데 본제.
Twitter API로 취득한 데이터를 pandas의 DataFrame형으로 한 후, CSV 형식으로 파일로서 보존했습니다만, 보존한 파일을 읽어들이면, 데이터의 행수가 증가하고 있거나, 컬럼에 어긋남이 생기고 있어, 보존시의 형태를 전혀 유지하지 않았던 것입니다.

어떻게 하면 예를 들어 다음과 같은 코드를 실행하면,
# 改行コードが\rのとき
import pandas as pd
from IPython.display import display

df = pd.DataFrame([{ 'created_at': '12:00', 
                     'text': 'メッセージ\rメッセージ\rメッセージ',
                     'tweet_id': 12345,
                     'user_id': 67890,
                    }])  
display(df) # DataFrameを出力

df.to_csv('test.csv', encoding="utf-8") # CSV形式で保存

df = pd.read_csv('test.csv', index_col=0)
display(df) # 読み込んだCSVデータを出力

결과는 다음과 같습니다. DataFrame(상)은 정상입니다만, 한 번 CSV 형식으로 변환하면 무너지고 있지요(아래).\r 를 경계로 행이 한층 내려가고, 컬럼과 값이 미스매치 하고 있습니다 (인덱스에 값이 들어가 있어 엄청...). 빈 데이터는 모두 NaN 입니다.


분명히, 문제 아이는 개행 코드의 \r 만인 것 같습니다.\n 이나 \r\n 의 경우는, 데이터가 무너지지 않고 저장할 수 있습니다↓
# 改行コードが\nのとき
df = pd.DataFrame([{ 'created_at': '12:00', 
                     'text': 'メッセージ\nメッセージ\nメッセージ',
                     'tweet_id': 12345,
                     'user_id': 67890,
                    }])  
display(df) # DataFrameを出力

df.to_csv('test.csv', encoding="utf-8") # CSV形式で保存

df = pd.read_csv('test.csv', index_col=0)
display(df) # 読み込んだCSVデータを出力


# 改行コードが\r\nのとき
df = pd.DataFrame([{ 'created_at': '12:00', 
                     'text': 'メッセージ\r\nメッセージ\r\nメッセージ',
                     'tweet_id': 12345,
                     'user_id': 67890,
                    }])  
display(df) # DataFrameを出力

df.to_csv('test.csv', encoding="utf-8") # CSV形式で保存

df = pd.read_csv('test.csv', index_col=0)
display(df) # 読み込んだCSVデータを出力



해결 방법



그 1


\r\n로 바꿉니다.\r\n 에 포함되는 \r 는 , 치환해 버리면(자) 개행이 1 개 증가해 버리므로 , 주의할 필요가 있습니다.
df = pd.DataFrame([{ 'created_at': '12:00', 
                     'text': 'メッセージ\rメッセージ\rメッセージ',
                     'tweet_id': 12345,
                     'user_id': 67890,
                    }])  
display(df) # DataFrameを出力

# \r\nの場合は除いて、\rを\nに置換する
if ('\r' in df['text'][0]) and not ('\r\n' in df['text'][0]):
    df['text'][0] = df['text'][0].replace('\r', '\n')

df.to_csv('test.csv', encoding="utf-8") # CSV形式で保存

df = pd.read_csv('test.csv', index_col=0)
display(df) # 読み込んだCSVデータを出力



추가



개행 코드를 전부 \n 에 통일하는 것이 좋을 것 같네요. 다음 코드에서 \r\n\r를 모두 바꿀 수 있습니다.
대체하는 순서를 잘못하면 \r\n\n\n 가 되어 버리므로 주의합시다.
df['text'][0] = df['text'][0].replace('\r\n', '\n').replace('\r', '\n')

df.to_csv('test.csv', encoding="utf-8") # CSV形式で保存

df = pd.read_csv('test.csv', index_col=0)
display(df) # 読み込んだCSVデータを出力

그 2



pickle 을 사용한다.
df = pd.DataFrame([{ 'created_at': '12:00', 
                     'text': 'メッセージ\nメッセージ\nメッセージ',
                     'tweet_id': 12345,
                     'user_id': 67890,
                    }])  
display(df) # DataFrameを出力

df.to_pickle('test.pickle') # pickle形式で保存

df = pd.read_pickle('test.pickle')
display(df) # 読み込んだpickleデータを出力



pickle 파일은 코드로 읽어내지 않는 한 내용을 확인할 수 없다(Excel등으로 열 수가 없다) 때문에, 간단하게 데이터를 확인할 수 있도록 하고 싶다면, \r\n 치환해 CSV 형식 에서 저장하는 방법이 좋다고 생각합니다.

이상

좋은 웹페이지 즐겨찾기