Heim  >  Artikel  >  Backend-Entwicklung  >  So lesen Sie TXT-Text Zeile für Zeile und entfernen Duplikate unter Python3.4.3

So lesen Sie TXT-Text Zeile für Zeile und entfernen Duplikate unter Python3.4.3

不言
不言Original
2018-05-02 16:17:422896Durchsuche

Dieser Artikel stellt hauptsächlich die Methode zum zeilenweisen Lesen von TXT-Texten und zum Entfernen von Duplikaten unter Python3.4.3 vor. Jetzt kann ich ihn mit Ihnen teilen

Zu den Problemen, die beim Lesen und Schreiben von Dateien beachtet werden sollten, gehören:

1. Schließen Sie den Dateideskriptor sofort nach Abschluss des Vorgangs

3. Codekompatibilität

Mehrere Methoden:

#!/bin/python3
original_list1=[" "]
original_list2=[" "]
original_list3=[" "]
original_list4=[" "]
newlist1=[" "]
newlist2=[" "]
newlist3=[" "]
newlist4=[" "]
newtxt1=""
newtxt2=""
newtxt3=""
newtxt4=""
#first way to readline
f = open("duplicate_txt.txt","r+")    # 返回一个文件对象  
line = f.readline()           # 调用文件的 readline()方法 
while line:  
  original_list1.append(line)          
  line = f.readline()  
f.close() 
#use "set()" remove duplicate str in the list
# in this way,list will sort randomly
newlist1 = list(set(original_list1))
#newlist1 = {}.fromkeys(original_list1).keys() #faster 
#rebuild a new txt 
newtxt1="".join(newlist1)
f1 = open("noduplicate1.txt","w")
f1.write(newtxt1)
f1.close()
###################################################################
#second way to readline
for line in open("duplicate_txt.txt","r+"):  
  original_list2.append(line)
newlist2 = list(set(original_list2))
newlist2.sort(key=original_list2.index)         #sort
#newlist2 = sorted(set(original_list2),key=l1.index)  #other way
newtxt2="".join(newlist2)
f2 = open("noduplicate2.txt","w")
f2.write(newtxt2)
f2.close()
###################################################################
#third way to readline
f3 = open("duplicate_txt.txt","r")  
original_list3 = f3.readlines()       #读取全部内容 ,并以列表方式返回 
for i in original_list3:          #遍历去重
  if not i in newlist3:
      newlist3.append(i)
newtxt3="".join(newlist3)
f4 = open("noduplicate3.txt","w")
f4.write(newtxt3)
f4.close()
###################################################################
#fourth way
f5 = open('duplicate_txt.txt',"r+") 
try: 
  original_list4 = f5.readlines() 
  [newlist4.append(i) for i in original_list4 if not i in newlist4]
  newtxt4="".join(newlist4)
  f6 = open("noduplicate4.txt","w")
  f6.write(newtxt4)
  f6.close()
finally: 
  f5.close()

Ergebnis:

Vor der Deduplizierung:

Nachher Deduplizierung (nicht in der richtigen Reihenfolge):

Nach der Deduplizierung (in der richtigen Reihenfolge):

ZusammenfassungDas folgende Programm umfasst Dateilese- und Schreibvorgänge sowie verknüpfte Listenvorgänge. Mehrere unter erwähnte Probleme Am Anfang des Artikels ist mir die Codierung egal, da ich kein Chinesisch verwende, aber ich muss es trotzdem hier erwähnen:

f = open("test.txt","w")
f.write(u"你好")

Der obige Code meldet einen Fehler, wenn er in Python2 ausgeführt wird.

Der Fehler wird gemeldet, weil das Programm die Unicode-Zeichenfolge nicht direkt speichern kann. Sie muss codiert und in ein Binärbyte konvertiert werden Sequenz vom Typ str, bevor sie gespeichert werden kann.

Die write()-Methode konvertiert die Kodierung automatisch und verwendet standardmäßig das ASCII-Kodierungsformat. ASCII kann Chinesisch nicht verarbeiten, sodass ein UnicodeEncodeError auftritt.

Der richtige Weg besteht darin, das Format vor dem Aufruf der write()-Methode manuell zu konvertieren und zum Konvertieren in str utf-8 oder gbk zu verwenden.

f = open("test.txt","w")
text=u"你好"
text=text.encode(encoding='utf-8')
f.write(text)

Über close(): Welche Auswirkungen hat es, wenn nicht geschlossen wird? ? Nach Abschluss des Vorgangs führt das Nichtschließen der Datei zu einer Verschwendung von Systemressourcen, da die Anzahl der Dateideskriptoren, die vom System geöffnet werden können, begrenzt ist. Linux ist 65535.

Im Allgemeinen ist es nach dem Schließen in Ordnung, es kann jedoch zu besonderen Situationen kommen. Beispielsweise ist beim Aufrufen der Funktion open() ein Fehler aufgetreten und der Aufruf von close() ist definitiv nicht ausreichend einen Fehler melden. Eine andere Methode besteht darin, dass, wenn während write() nicht genügend Speicherplatz vorhanden ist, ein Fehler gemeldet wird und close() keine Chance zur Ausführung hat. Der richtige Weg besteht darin, „try außer“ zu verwenden, um die Ausnahme abzufangen:

f = open("test.txt","w")
try:
  text=u"你好"
  text=text.encode(encoding='utf-8')
  f.write(text)
except: IOError as e:
  print("oops,%s"%e.args[0])
finally:
  f.close()

Eine elegantere Schreibweise ist die Verwendung mit...as.

with open("test.txt","w") as f:
  text=u"你好"
  f.write(text.encode(encoding='utf-8'))

Das Dateiobjekt implementiert das Morgen- und Nachmittagsmanagerprotokoll. Wenn das Programm die with-Anweisung eingibt, weist es das Dateiobjekt der Variablen f und zu Es wird automatisch die Methode close() aufgerufen.

Zu Kompatibilitätsproblemen: Die open()-Funktionen von Python2 und Python3 sind unterschiedlich. Letztere können Zeichen in der Funktion angeben Format.

Wie löse ich das Kompatibilitätsproblem open() zwischen Python2 und Python3?

Verwenden Sie die open()-Funktion unter dem io-Modul io.open in Python2 entspricht der open-Funktion von Python3

from io import open
with open("test.txt","w",encoding='utf-8') as f:
  f.write(u"你好")

Verwandt Empfehlungen:


Beispiel für das Dekomprimieren von ZIP-Dateien und das Löschen von Dateien unter python_python


Das obige ist der detaillierte Inhalt vonSo lesen Sie TXT-Text Zeile für Zeile und entfernen Duplikate unter Python3.4.3. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn