Maison  >  Article  >  développement back-end  >  Comment lire le texte txt ligne par ligne et supprimer les doublons sous python3.4.3

Comment lire le texte txt ligne par ligne et supprimer les doublons sous python3.4.3

不言
不言original
2018-05-02 16:17:422896parcourir

Cet article présente principalement la méthode de lecture du texte txt ligne par ligne et de suppression des doublons sous python3.4.3. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Les problèmes auxquels il convient de prêter attention lors de la lecture et de l'écriture de fichiers incluent :

1. Codage des caractères

2. Fermez immédiatement le descripteur de fichier. une fois l'opération terminée

3. Compatibilité des codes

Plusieurs méthodes :

#!/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()

Résultat :

Avant déduplication :

Après déduplication (non ordonnée) :

Après déduplication (ordonnée) :

Résumé

Le programme ci-dessous implique des opérations de lecture et d'écriture de fichiers et des opérations de liste chaînée. début de l'article C'est une question comme je n'utilise pas le chinois, je m'en fiche de l'encodage, mais je dois quand même le mentionner ici :

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

Si le code ci-dessus est en python2 Lors de l'exécution, une erreur

sera signalée car le programme ne peut pas enregistrer directement la chaîne Unicode. Elle doit être codée et convertie. dans une séquence d'octets binaires de type str avant de pouvoir être enregistrée.

La méthode write() convertira automatiquement l'encodage, en utilisant le format d'encodage ascii par défaut, et ascii ne peut pas gérer le chinois, donc UnicodeEncodeError se produit.

La bonne méthode consiste à convertir manuellement le format avant d'appeler la méthode write(), et à utiliser utf-8 ou gbk pour convertir en str.

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

À propos de close() :

Que se passera-t-il si vous ne Je ne le ferme pas ? Et l'impact ? Une fois l'opération terminée, ne pas fermer le fichier entraînera un gaspillage de ressources système, car le nombre de descripteurs de fichiers pouvant être ouverts par le système est limité. Linux est 65535.

De manière générale, tout ira bien après la fermeture, mais il peut y avoir des situations particulières. Par exemple, une erreur s'est produite lors de l'appel de la fonction open() et les autorisations sont définitivement insuffisantes. signaler une erreur. Une autre méthode est que s'il n'y a pas suffisamment d'espace disque pendant write(), une erreur sera signalée et close() n'aura aucune chance de s'exécuter. La bonne façon est d'utiliser try except pour intercepter l'exception :

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()

Une façon d'écrire plus élégante est d'utiliser with...as.

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

L'objet fichier implémente le protocole du gestionnaire du matin et de l'après-midi Lorsque le programme entre dans l'instruction with, l'objet fichier sera affecté à la variable f. . Lorsque le programme se termine avec La méthode close() sera appelée automatiquement.

Concernant les problèmes de compatibilité :

Les fonctions open() de python2 et python3 sont différentes. Ces dernières peuvent spécifier des caractères dans la fonction Encoding. format.

Comment résoudre le problème de compatibilité open() entre python2 et python3 ?

Utiliser la fonction open() sous le module io.io.open en python2 est équivalent à la fonction open de python3

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

Recommandations associées :


Exemples de décompression de fichiers zip et de suppression de fichiers sous python_python


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn