2017-08-28 33 views
0

我已將推文保存在JSON文本文件中。我有一位朋友想要包含關鍵字的推文,並且推文需要以.csv格式保存。找到推文很容易,但我遇到了兩個問題,並正在努力尋找一個好的解決方案。將推文保存爲.csv,包含字符串文字和實體

樣本數據爲here。我已經包含了不工作的.csv文件以及每行都是JSON格式的推文的文件。

爲了進入數據框,我使用了pd.io.json.json_normalize。它工作順利,處理嵌套字典,但pd.to_csv不起作用,因爲它不處理,據我所知,字符串文字很好。其中一些推文在text字段中包含'\n'pandas在發生時寫入新行。

沒問題,我處理pd['text']以刪除'\n'。由此產生的文件仍然有太多的行,1863年應該是1388。然後我修改代碼來替換所有字符串字面量:

tweets['text'] = [item.replace('\n', '') for item in tweets['text']] 
tweets['text'] = [item.replace('\r', '') for item in tweets['text']] 
tweets['text'] = [item.replace('\\', '') for item in tweets['text']] 
tweets['text'] = [item.replace('\'', '') for item in tweets['text']] 
tweets['text'] = [item.replace('\"', '') for item in tweets['text']] 
tweets['text'] = [item.replace('\a', '') for item in tweets['text']] 
tweets['text'] = [item.replace('\b', '') for item in tweets['text']] 
tweets['text'] = [item.replace('\f', '') for item in tweets['text']] 
tweets['text'] = [item.replace('\t', '') for item in tweets['text']] 
tweets['text'] = [item.replace('\v', '') for item in tweets['text']] 

同樣的結果,pd.to_csv節省了比實際更多的鳴叫行的文件。我可以在所有列中替換字符串文字,但這很笨拙。

很好,不要用pandaswith open(outpath, 'w') as f:等等創建一個正確的行數的.csv文件。但是,使用pd.read_csv讀取文件或者逐行讀取將會失敗。

由於Twitter如何處理entities而失敗。如果推文的文本包含網址,提及,標籤,媒體或鏈接,則Twitter會返回包含逗號的字典。當pandas扁平化推文時,逗號會保存在一列中,這很好。但是,當讀入數據時,熊貓將應該將一列分成多列。例如,一列可能看起來像[{'screen_name': 'ProfOsinbajo','name': 'Prof Yemi Osinbajo','id': 2914442873,'id_str': '2914442873', 'indices': [0,' 13]}]',等逗號分割造成太多的列:

[{'screen_name': 'ProfOsinbajo', 
'name': 'Prof Yemi Osinbajo', 
'id': 2914442873", 
'id_str': '2914442873'", 
'indices': [0, 
13]}] 

這是我的結果是否使用with open(outpath) as f:爲好。用這種方法,我必須分割線,所以我分開逗號。同樣的問題 - 如果它們出現在列表中,我不想在逗號分割。

我希望這些數據在保存到文件或從文件讀取時作爲一列處理。我錯過了什麼?根據the repository above的數據,我想將forstackoverflow2.txt轉換爲一個.csv,其行數與推文數量相同。調用這個文件A.csv,假設它有100列。打開時,A.csv也應該有100列。

我確定有些細節我遺漏了,所以請讓我知道。

回答

0

使用csv模塊工作。它將文件寫入.csv,同時對行進行計數,然後將其讀回並再次對行進行計數。

結果匹配,並在Excel中打開.csv也提供191列和1338行數據。

import json 
import csv 

with open('forstackoverflow2.txt') as f,\ 
    open('out.csv','w',encoding='utf-8-sig',newline='') as out: 
    data = json.loads(next(f)) 
    print('columns',len(data)) 
    writer = csv.DictWriter(out,fieldnames=sorted(data)) 
    writer.writeheader() # write header 
    writer.writerow(data) # write the first line of data 
    for i,line in enumerate(f,2): # start line count at two 
     data = json.loads(line) 
     writer.writerow(data) 
    print('lines',i) 

with open('out.csv',encoding='utf-8-sig',newline='') as f: 
    r = csv.DictReader(f) 
    lines = list(r) 
    print('readback columns',len(lines[0])) 
    print('readback lines',len(lines)) 

輸出:

columns 191 
lines 1338 
readback lines 1338 
readback columns 191 
0

@馬克Tolonen的回答是有益的,但我最終會一個單獨的路徑。將推文保存到文件時,我從JSON中的任意位置刪除了所有\r,\n,\t\0個字符。然後,我使用製表符分隔保存文件,以便像locationtext等字段中的逗號不會混淆read函數。

+0

csv模塊會引用字段並轉義字段中的引號字符,因此您不必預先處理JSON或使用製表符分隔的字段,因爲逗號將位於帶引號的字段中。 –

+0

這就是我的想法,但我無法找出任何更好的理由,我無法讓我的代碼工作。也許它是在移動字面字符串。另外,我沒有嘗試'''csv''',所以也許我應該有。我爲沒有使用Python的朋友這樣做,所以我想避免這種解決方案。 – ZacharyST

相關問題