2017-08-28 29 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

相关问题