2016-05-29 41 views
0

爲什麼不能這樣工作?我想唯一的結果我從REST API之前把我寫的文件 -寫入文件之前的唯一字符串 - python

MISP_HOST="https://192.168.1.8" 
API_KEY="asdfasdfas" 
EXPORT_DATA="attributes/text/download/md5" 
OUTPUT_FILE="md5-"+today 

def main(): 
    URL="%s/%s" % (MISP_HOST, EXPORT_DATA) 
    request = urllib2.Request(URL) 
    f = open(OUTPUT_FILE,'w') 
    request.add_header('Authorization', API_KEY) 
    data = urllib2.urlopen(request).read() 
    set(data) 
    print type(data) 
    f.write(data) 
    f.close() 

它不出差錯工作,但數據肯定不是唯一的。我試圖不在bash中這樣做。你能解釋爲什麼它不工作嗎?非常感謝!!!

+0

你是什麼意思的「獨特的結果」?你想讓結果中的每個單詞出現一次嗎?結果是純文本嗎? – tdelaney

+3

執行'data = set(data)'來實際保留創建的集合。請注意,'data'只是一個字符串,所以'set(data)'不會達到你所期望的。你應該先解析數據。 – poke

回答

2

如果您的結果是純文本,您可以使用正則表達式來查找文本中的所有單詞,然後從那裏創建一個集合。這個例子還降低了單詞的情況,使得該集合不區分大小寫,並將每個單詞寫在它自己的行上。

import re 

MISP_HOST="https://192.168.1.8" 
API_KEY="asdfasdfas" 
EXPORT_DATA="attributes/text/download/md5" 
OUTPUT_FILE="md5-"+today 
def main(): 
    URL="%s/%s" % (MISP_HOST, EXPORT_DATA) 
    request = urllib2.Request(URL) 
    f = open(OUTPUT_FILE,'w') 
    request.add_header('Authorization', API_KEY) 
    data = urllib2.urlopen(request).read() 
    unique = set(word.lower() for word in re.findall(r'\w+', data)) 
    # that could be expanded to 
    # wordlist = re.findall(r'\w+', data) 
    # unique = set(word.lower() for word in wordlist) 
    print type(unique) 
    f.write('\n'.join(unique)) 
    f.close() 
+0

工作,但我仍然不明白爲什麼我不能將字符串轉換爲列表,然後到一組。 – Dpitt1968

+0

您沒有將字符串轉換爲您的示例中的列表。將字符串轉換爲列表時,必須詢問該字符串的格式以及希望列表的格式。我猜想「數據」是純文本,你想提取單詞。這就是're.findall'所做的。它在字符串中創建了所有單詞的列表(這就是'\ w +'表達式的作用 - 它匹配組成一個單詞的所有字符)。我還寫了一個生成器,在創建集合之前將此列表的項目轉換爲小寫字母,從而使它更復雜一些。 – tdelaney