web-dev-qa-db-fra.com

Fonction Split ajouter: \ xef \ xbb \ xbf ... \ n à ma liste

Je veux ouvrir mon file.txt et divisez toutes les données de ce fichier.

Voici mon file.txt:

some_data1 some_data2 some_data3 some_data4 some_data5

et voici mon python:

>>>file_txt = open("file.txt", 'r')
>>>data = file_txt.read()
>>>data_list = data.split(' ')
>>>print data
some_data1 some_data2 some_data3 some_data4 some_data5
>>>print data_list
['\xef\xbb\xbfsome_data1', 'some_data1', "some_data1", 'some_data1', 'some_data1\n']

Comme vous pouvez le voir ici, lorsque j'imprime mon data_list il ajoute à ma liste ceci: \xef\xbb\xbf et ça: \n. Que sont-ils et comment puis-je en nettoyer ma liste.

Merci.

48
Michael

Votre fichier contient BOM UTF-8 au début.

Pour vous en débarrasser, décodez d'abord le contenu de votre fichier en unicode.

fp = open("file.txt")
data = fp.read().decode("utf-8-sig").encode("utf-8")

Mais mieux vaut ne pas le recoder en utf-8, Mais travailler avec du texte unicoded. Il existe une bonne règle: décoder toutes vos données de texte d'entrée en unicode dès que possible et ne travailler qu'avec unicode; et coder les données de sortie au codage requis le plus tard possible. Cela vous évitera de nombreux maux de tête.

Pour lire des fichiers plus gros dans un certain encodage, utilisez io.open ou codecs.open .

Vérifiez également this .

Utilisez str.strip() ou str.rstrip() pour supprimer le caractère de nouvelle ligne \n.

71
warvariuc

Le \xef\xbb\xbf Est un Byte Order Mark pour UTF-8 - le \xest une séquence d'échappement indiquant que les deux caractères suivants sont un hex séquence représentant le code de caractère.

Le \n Est un nouveau caractère de ligne. Pour supprimer cela, vous pouvez utiliser rstrip() .

data.rstrip()
data_list = data.split(' ')

Pour supprimer la marque d'ordre des octets, vous pouvez utiliser io.open (en supposant que vous utilisez 2.6 ou 2.7) pour ouvrir le fichier en mode utf-8. Notez que cela peut être un peu plus lent car il est implémenté dans Python - si la vitesse ou des versions plus anciennes de Python sont nécessaires, jetez un œil à codecs.open .

Essayez quelque chose comme ceci:

import io

# Make sure we don't lose the list when we close the file
data_list = []

# Use `with` to ensure the file gets cleaned up properly
with io.open('file.txt', 'r', encoding='utf-8') as file:
    data = file.read() # Be careful when using read() with big files
    data.rstrip() # Chomp the newline character
    data_list = data.split(' ')

print data_list
9
thegrinner

Comme les autres l'ont mentionné, vous avez affaire à un fichier qui contient la nomenclature UTF-8 à son début.

Ils vous disent tous comment y faire face ou le supprimer directement.

MAIS, s'il vous arrive de devoir travailler avec un seul fichier statique (ou un petit ensemble statique d'entre eux), vous souhaiterez peut-être supprimer activement la nomenclature afin de ne pas avoir à y faire face.

En fait, la plupart des éditeurs de texte vous permettent de convertir d'un encodage à un autre et parfois UTF-8 et UTF-8 avec BOM sont répertoriés séparément.

Le premier qui me vient à l'esprit (mais il y en a beaucoup) est Notepad ++. Allez simplement dans Encodage> Convertir en UTF-8 sans BOM, enregistrez le fichier et vous êtes prêt.

7
JeromeJ