【问题标题】:Removing Duplicate CSV Entries with python使用 python 删除重复的 CSV 条目
【发布时间】:2012-06-05 21:31:33
【问题描述】:

我刚刚完成了一个(叹气)终于可以工作的脚本。它在 Twitter 上搜索关键字。将结果写入 csv 中,其中包含 4 列关键字、Tweet、Lat、Lon(位置)。我正在使用的代码是:

import tweepy
import csv

keywordList = ['McDonalds', 'Taco Bell', 'Burger King',]
for keyword in keywordList:
    result = tweepy.api.search(q=keyword,rpp=1000,page=2, geocode= "34.085422,-117.900879,500mi" )

    with open(r'C:\Temp\results.csv', 'a') as acsv:
        w = csv.writer(acsv)
        for tweet in result:
            lat, lon = tweet.geo if tweet.geo else ('', '')
            try:
                a = tweet.geo['coordinates']
                print a[0] , a[1]
                print tweet.text
                w.writerow((keyword, tweet.text, a[0] , a[1]))
            except:
                pass

我想使用任务管理器或 python 每 5 分钟运行一次此搜索,但它会重写重复项。我打算使用以下代码删除重复项,但发生了两件事。 resutls2.csv 是空白的,当我打开 csv 时,它被锁定,我必须以只读方式查看它。我尝试了 f1.close()、writer.close() 等,但它说“csv.reader”对象没有关闭属性。

我最担心的是通过写入新的 csv 或在每次搜索时以某种方式删除并写入同一个表来避免重复。任何建议都非常感谢!

import csv

f1 = csv.reader(open(r'C:\Temp\results.csv', 'rb'))
writer = csv.writer(open(r'C:\Temp\results2.csv', 'wb'))
tweet = set()
for row in f1:
    if row[1] not in tweet:
        writer.writerow(row)
        tweet.add( row[1] )
f1.close()
writer.close()

【问题讨论】:

  • 使用数据库并声明对您想要不同的列组合的唯一约束...如果您不想运行数据库,只需使用 sqlite。
  • 也许比 Endophage 的建议更笼统:为什么不扩展脚本以读取先前生成的 .csv 文件并仅在它们不存在时才添加条目?
  • @user946850 这就是我想做的。我在上面做了这个脚本来测试它是否首先工作。然后我打算将它添加到原始脚本中。
  • 这个问题:stackoverflow.com/questions/3216954/python-no-csv-close 涉及关闭 CSV 读取器和写入器。除了每个关键字只允许一条推文外,您的代码看起来是正确的。不确定这是否符合您的要求。
  • @user946850 不,它会为每个关键字返回多条推文,但仅在存在地理位置时才返回。不知道为什么我在运行新代码时得到一个空白的 csv

标签: python csv


【解决方案1】:

这是一个重构版本:

编辑: unicode,多么有趣 - 我在 read_csv() 中添加了一个 .decode() 调用,在 append_csv() 中添加了一个 .encode() 调用;这应该可以解决您的问题(我认为 - 您可能需要决定使用字符串编解码器)。

import tweepy
import csv
from collections import defaultdict
import time

FILE = 'c:/temp/results.csv'
KEYWORDS = ['McDonalds', 'Taco Bell', 'Burger King']
WHERE = "34.085422,-117.900879,500mi"
DELAY = 300  # seconds

def _float(s, err=None):
    try:
        return float(s)
    except ValueError:
        return err

def _str(f, err=""):
    return err if f is None else str(f)

def read_csv(fname=FILE):
    data = defaultdict(dict)
    with open(fname, 'rb') as inf:
        incsv = csv.reader(inf)
        for kw,tw,lat,lon in incsv:
            # added .decode() call to handle saved unicode chars
            data[kw][tw.decode()] = (_float(lat), _float(lon))
    return data

def append_csv(data, fname=FILE):
    with open(fname, "ab") as outf:
        outcsv = csv.writer(outf)
        # added .encode() call to handle saved unicode chars
        outcsv.writerows((kw,tw.encode(),_str(lat),_str(lon)) for kw,dat in data.iteritems() for tw,(lat,lon) in dat.iteritems())

def search_twitter(keywords=KEYWORDS, loc=WHERE):
    data = defaultdict(dict)
    for kw in keywords:
        for tweet in tweepy.api.search(q=kw, rpp=1000, page=2, geocode=loc):
            data[kw][tweet.text] = tweet.geo if tweet.geo else (None,None)
    return data

def calc_update(old_data, new_data):
    diff = defaultdict(dict)
    for kw,dat in new_data.iteritems():
        for tw,loc in dat.iteritems():
            if tw not in old_data[kw]:
                diff[kw][tw] = old_data[kw][tw] = loc
    return old_data, diff

def show_data(data):
    for kw,dat in data.iteritems():
        for tw,(lat,lon) in dat.iteritems():
            print("<{},{}> {} [{}]".format(_str(lat,"???"), _str(lon,"???"), tw, kw))

def main():
    data = read_csv()
    while True:
        new_data  = search_twitter()
        data,diff = calc_update(data, new_data)
        append_csv(diff)
        show_data(diff)
        time.sleep(DELAY)

if __name__=="__main__":
    main()

【讨论】:

  • @Hugh Bothwell 谢谢你。我没想到有人会重写整个代码。虽然很感激,但我收到了这个错误:line 31, in append_csv outcsv.writerows((kw,tw,_str(lat),_str(lon)) for kw,dat in data.iteritems() for tw,(lat,lon) in dat.iteritems()) UnicodeEncodeError: 'ascii' codec can't encode character u'\xbf' in position 24: ordinal not in range(128)
  • @ Hugh Bothwell 我仍然遇到同样的错误。下面,我复制并粘贴了我的excel表。最上面的部分是我运行原始代码时产生的。它只返回带有地理位置的推文(我想要的)。底部是你的。我认为 unicode 错误与纬度有关。 Burger King, You don't want no dry biscuit lol to funny@burger king,31.5553,-110.358 McDonalds, Is may be just me but watchin Super Size Me always makes me want some Mcdonalds! 结果通常如下所示:@Jessica Mcdonalds 很好 {u'type': u'Point', u'coordinates': [33.9443, -118.0038]}
猜你喜欢
  • 2011-12-02
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 2018-03-18
  • 2021-08-09
  • 1970-01-01
相关资源
最近更新 更多