【问题标题】:Speed up parsing Twitter from json to csv (python)加快将 Twitter 从 json 解析为 csv (python)
【发布时间】:2017-07-31 07:23:15
【问题描述】:

这是我的第一篇文章,所以请多多包涵。

我有一个大型 (~1GB) json 文件,其中包含我通过 Twitter 的 Streaming API 收集的推文。我能够成功地将其解析为包含我需要的字段的 CSV,但是,它非常缓慢 - 即使我正在提取少数实体(用户 ID、纬度/经度以及将 Twitter 日期字符串解析为日期/时间)。我可以使用哪些方法来尝试加快速度?目前需要几个小时,我期待收集更多数据....

import ujson
from datetime import datetime
from dateutil import tz
from csv import writer
import time

def hms_string(sec_elapsed):
    h = int(sec_elapsed / (60 * 60))
    m = int((sec_elapsed % (60 * 60)) / 60)
    s = sec_elapsed % 60.
    return "{}:{:>02}:{:>05.2f}".format(h, m, s)

start_time = time.time()

with open('G:\Programming Projects\GGS 681\dmv_raw_tweets1.json', 'r') as in_file, \
 open('G:\Programming Projects\GGS 681\dmv_tweets1.csv', 'w') as out_file:

print >> out_file, 'user_id,timestamp,latitude,longitude'
csv = writer(out_file)
tweets_count = 0

for line in in_file:
    tweets_count += 1
    tweets = ujson.loads(line)
    timestamp = []
    lats = ''
    longs = ''

    for tweet in tweets:
        tweet = tweets
        from_zone = tz.gettz('UTC')
        to_zone = tz.gettz('America/New_York')
        times = tweet['created_at']
        for tweet in tweets:
            times = tweets['created_at']
            utc = datetime.strptime(times, '%a %b %d %H:%M:%S +0000 %Y')
            utc = utc.replace(tzinfo=from_zone) #comment out to parse to utc
            est = utc.astimezone(to_zone) #comment out to parse to utc
            timestamp = est.strftime('%m/%d/%Y %I:%M:%S %p')  # use %p to differentiate AM/PM

    for tweet in tweets:
        if tweets['geo'] and tweets['geo']['coordinates'][0]:
            lats, longs = tweets['geo']['coordinates'][:2]
        else:
            pass

    row = (
        tweets['user']['id'],
        timestamp,
        lats,
        longs
        )

    values = [(value.encode('utf8') if hasattr(value, 'encode') else value) for value in row]
    csv.writerow(values)

end_time = time.time()
print "{} to execute this".format(hms_string(end_time - start_time))

【问题讨论】:

  • 为什么要在 tweets 上进行内部迭代,而您已经对其进行了迭代?
  • 老实说,可能只是用户错误

标签: python json csv twitter


【解决方案1】:

看来我可能已经解决了这个问题。查看我实际运行的代码,看起来我下面的 if/else 语句不正确。

for tweet in tweets:
        if tweets['geo'] and tweets['geo']['coordinates'][0]:
            lats, longs = tweets['geo']['coordinates'][:2]
        else:
            None

当我应该使用 pass 或 continue 时,我正在使用 else: None。此外,我在原始代码中删除了推文中的内部迭代。它能够在大约 4 分钟内解析一个 60mb 的文件。不过,如果有人有任何使这更快的提示,我愿意接受您的建议。

编辑:我还使用了ujson,它显着提高了从 twitter 加载/转储 json 数据的速度。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2014-08-18
    • 2017-04-13
    • 2021-07-29
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多