簡體   English   中英

(PRAW)從評論中獲取一個值,然后用另一列的數據作為答復,該數據與第一條數據在同一行

[英](PRAW) Get a value from a comment, then reply with another column's data, that's on the same row as the first piece of data

這是CSV代碼。

import praw
import time
import csv
import codecs
import re
from collections import defaultdict 

def read_csv():
with open('CPU-Bench.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        import pandas as pd
        df = pd.read_csv('CPU-Bench.csv')
        saved_column = df.URL #you can also use df['column_name']
    print saved_column

saved_column = df.URL #you can also use df['column_name']


model_url_dict = read_csv()

CSV文件如下所示:

Type,Part Number,Brand,Model,Rank,Benchmark,Samples,URL
CPU,BX80671I76950X,Intel,Core i7-6950X,1,117,25,http://cpu.userbenchmark.com/Intel-Core-i7-6950X/Rating/3604
CPU,BX80671I76900K,Intel,Core i7-6900K,2,112,28,http://cpu.userbenchmark.com/Intel-Core-i7-6900K/Rating/3605
CPU,BX80671I76850K,Intel,Core i7-6850K,3,102,55,http://cpu.userbenchmark.com/Intel-Core-i7-6850K/Rating/3606
CPU,BX80648I75960X,Intel,Core i7-5960X,4,102,1651,http://cpu.userbenchmark.com/Intel-Core-i7-5960X/Rating/2580
CPU,BX80662I76700K,Intel,Core i7-6700K,5,98.5,21550,http://cpu.userbenchmark.com/Intel-Core-i7-6700K/Rating/3502
CPU,BX80671I76800K,Intel,Core i7-6800K,6,97,103,http://cpu.userbenchmark.com/Intel-Core-i7-6800K/Rating/3607

我想這樣做,以便用戶說“!benchmark i7 6950x”或“!benchmark i7-6950x”,“!benchmark Core i7-6950x”或“!benchmark Intel Core i7-6950x”,在!benchmark之后查找字符串(在本例中為i7 6950x),然后查找URL列,然后回復“此處有一些基准”

但是,代替的是所選的CPU(在這種情況下,再次為i7 6950x)

並且代替url_column的是該CPU的URL(在本例中為http://cpu.userbenchmark.com/Intel-Core-i7-6950X/Rating/3604

抱歉,這很令人困惑,但是,我該怎么做?

您絕對需要設置reddit代理,將其作為設置中的reddit應用程序進行身份驗證,以及對普通bot所做的所有其他操作。 哦,將數據幀解析為字典以方便查找也是一件好事(因為只有在bot啟動后才進行查找,然后才有非常快的查找時間)。

因此,我們將需要像這樣的字典{'Intel Core i7-6950x':'http://cpu.userbenchmark.com/Intel-Core-i7-6950X/Rating/3604', ...} ,考慮到這是非常瑣碎的你已經讀過了。

我們還需要一種解析用戶實際想要進行基准測試的方法。 因此parse_models_from_comment(comment)會將praw.comment作為參數,並確保至少出現一次!benchmark 它可能必須與"\\!benchmark (.{0,10}) (i7|i5|i3)-(\\d)(X|K)"進行正則表達式匹配。 在看不到可能的數據的情況下無法撰寫更具體的內容。 而且該函數顯然會以正確的語法返回模型名稱(就像它們是用字典編寫的一樣)

現在,通過此設置,主例程可能如下所示:

reddit_client = praw.Reddit(user_agent='<your user agent>'
#OAuth2 shenanigans here
d = {} #filled dictionary
answeredComments = []
while True:
    for comment in reddit_client.get_comments('subreddit'):
        if '!benchmark' not in comment.body.lower():
            continue
        if comment in answeredComments:
            continue
        models = parse_models_from_comment(comment)
        if len(models)==0:
            response = 'I was unable to find benchamrk for given query'
        else:
            response = 'Here are some benchmarks for:\n\n'
            for model in models:
                response += str(model) + ' ' + str(d[model])+'\n\n'
        save_this_comment(comment)
        comment.reply(response)
    time.sleep(900) #15 min break

因此,在我之前編寫的內容之外,這是代碼說明。

reddit_client.get_comments('subreddit')顯然會返回最新注釋,默認限制為25,最大限制為1000(API限制)。

首先, if檢查此注釋是否與bot相關,如果沒有單個!benchmark ,它將跳過該注釋。 第二項檢查是確保尚未回答此評論。 出於此代碼段的目的,它只是一個本地列表,但事實證明必須要有帶有已答復注釋的高速緩存文件,甚至是單個表數據庫(使用sqlite或sth easy)。 這樣做是為了使bot記住它已經回答了哪些評論。 否則,它將無休止地發送垃圾郵件。

現在,我們有一個評論,並保證該機器人應該能夠找到一些模型。 因此,我們運行parse_models_from_comment(comment)函數以獲取用戶希望獲取基准的cpu模型的列表。

如果len(models)==0則意味着用戶指定了不在csv中的cpu,輸入了錯字,插入了錯誤的格式,正則表達式沒有捕獲它或其他。 無論如何,我們沒有任何模型可以使用,因此我們應該准備一個有關機器人搜索失敗的回復。

否則,我們需要處理一些事情,並且由於預先准備了字典以進行查找,因此可以快速准備具有任意數量鏈接的響應(也可以使用標記語法)

准備好響應后,首先我們需要登錄到文件/數據庫以確保該注釋已得到回答,而下一次praw將其發送給我們時,我們應該跳過它。

最后,我們發布帶有給定評論(無論是正面還是負面)的給定評論的回復。 請記住首先將注釋記錄到數據庫,然后發布回復,然后(可選)檢查api回復請求是否成功。 其他方法可能會證明是錯誤的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM