2016-06-02 5 views
1

Ich habe eine Frage zum Anhängen an Textdatei. Ich habe ein Skript geschrieben und was dieses Skript macht, ist, dass es die URL im JSON-Format liest und die Liste der Titel extrahiert und in die Datei "WordsInCategory.text" schreibt.Wie verhindert man das Schreiben in die txt-Datei die gleichen Wörter mit open (text.txt, a)?

Da dieser Code in einer Schleife verwendet wird, habe ich f1 = open ('WordsInCategory.text', 'a') verwendet.

Aber ich stieß auf ein Problem, das ist in der bereits vorhandenen Titel in die Datei hinzugefügt wird.

Ich habe Probleme mit einer Lösung, um dieses Problem zu lösen und mit 'w' wird überschrieben, was es geschrieben ist.

Mein Code ist wie folgt:

import urllib2 
import json 


url1 ='https://en.wikipedia.org/w/api.php?action=query&format=json&list=categorymembers&cmtype=page&cmtitle=Category:Geography&cmlimit=100' 

json_obj = urllib2.urlopen(url1) 
data1 = json.load(json_obj) 

f1 = open('WordsInCategory.text', 'a') 

for item in data1['query']: 
    for i in data1['query']['categorymembers']: 
     f1.write((i['title']).encode('utf8')+"\n") 

Bitte Ratschläge, wie ich meinen Code ändern sollte.

Vielen Dank.

+0

Grundsätzlich möchten Sie keine doppelte Zeile in Ihrer Datei? – 3kt

+0

Hi, das ist was ich brauche. Tut mir leid, mein Englisch ist schlecht. – windboy

Antwort

3

Ich würde vorschlagen, jeden Titel in einem Array zu speichern, bevor Sie eine Datei zu schreiben (und damit nur einmal in die angegebenen Datei zu schreiben) .

import urllib2 
import json 

data = [] 

f1 = open('WordsInCategory.text', 'w') 

url1 ='https://en.wikipedia.org/w/api.php?\ 
action=query&format=json&list=categorymembers\ 
&cmtype=page&cmtitle=Category:Geography&cmlimit=100' 

json_obj = urllib2.urlopen(url1) 
data1 = json.load(json_obj) 

for item in data1['query']: 
    for i in data1['query']['categorymembers']: 
     data.append(i['title'].encode('utf8')+"\n") 

# Do additional requests, and append the new titles to the data array 

f1.write(''.join(set(data))) 

f1.close() 

set erlaubt es mir, löschen Sie alle doppelten Eintrag: Sie können den Code auf diese Weise modifizieren.

Wenn die Titel im Speicher hält ein Problem ist, können Sie überprüfen, ob der Titel bereits vorhanden ist, bevor es in die Datei zu schreiben, aber es kann raubend schrecklich Zeit sein:

import urllib2 
import json 

data = [] 

url1 ='https://en.wikipedia.org/w/api.php?\ 
action=query&format=json&list=categorymembers\ 
&cmtype=page&cmtitle=Category:Geography&cmlimit=100' 

json_obj = urllib2.urlopen(url1) 
data1 = json.load(json_obj) 

for item in data1['query']: 
    for i in data1['query']['categorymembers']: 
     title = (i['title'].encode('utf8')+"\n") 

     with open('WordsInCategory.text', 'r') as title_check: 
      if title not in title_check: 
       data.append(title) 

with open('WordsInCategory.text', 'a') as f1: 
    f1.write(''.join(set(data))) 

# Handle additional requests 

Hoffen, dass es nützlich sein wird .

+0

nette Antwort. Was aber, wenn es zu viele Titel gibt? Werden nicht alle Variablen in Variablen gespeichert, die zu viel Speicher verbrauchen? Gibt es eine Möglichkeit, dies zu vermeiden? – SilentMonk

+1

Wenn Sie nicht alle Titel im Speicher behalten möchten, können Sie zeilenweise prüfen, ob der Titel bereits existiert. Aber das kann furchtbar lang sein. – 3kt

+0

Ich habe eine lange Liste von Titeln, aber ich werde das verwenden. Vielen Dank für Ihre Hilfe. – windboy

1

Sie können die Titel verfolgen, die Sie hinzugefügt haben.

titles = [] 

und dann jeden Titel in die Liste aufnehmen, wenn

Schreiben
if title not in titles: 
    # write to file 
    titles += title 
+0

Vielen Dank für Ihre Lösung. – windboy

Verwandte Themen