Python ouvre un fichier texte avec un espace entre chaque caractère
-
03-07-2019 - |
Question
Chaque fois que j'essaie d'ouvrir un fichier .csv avec la commande python
fread = open ('input.csv', 'r')
il ouvre toujours le fichier avec des espaces entre chaque caractère. Je suppose que le fichier texte a un problème car je peux ouvrir d'autres fichiers texte avec la même commande et ils sont chargés correctement. Est-ce que quelqu'un sait pourquoi un fichier texte se chargerait ainsi en python?
Merci.
Mettre à jour
Ok, je l’ai obtenu avec l’aide du message de Jarret Hardie
c'est le code que j'ai utilisé pour convertir le fichier en ascii
fread = open('input.csv', 'rb').read()
mytext = fread.decode('utf-16')
mytext = mytext.encode('ascii', 'ignore')
fwrite = open('input-ascii.csv', 'wb')
fwrite.write(mytext)
Merci!
La solution
Le message de récursif est probablement correct ... le contenu du fichier est probablement codé avec un jeu de caractères multi-octets. Si tel est le cas, vous pouvez probablement lire le fichier en python lui-même sans avoir à le convertir au préalable en dehors de python.
Essayez quelque chose comme:
fread = open('input.csv', 'rb').read()
mytext = fread.decode('utf-16')
L’indicateur 'b' garantit que le fichier est lu en tant que données binaires. Vous aurez besoin de connaître (ou de deviner) le codage d'origine ... Dans cet exemple, j'ai utilisé utf-16, mais YMMV. Cela convertira le fichier en unicode. Si vous avez vraiment un fichier avec des caractères multi-octets, je ne recommande pas de le convertir en ascii car vous risqueriez de perdre beaucoup de caractères au cours du processus.
EDIT: Merci d’avoir téléchargé le fichier. Il y a deux octets à l'avant du fichier qui indique qu'il utilise effectivement un jeu de caractères large. Si vous êtes curieux, ouvrez le fichier dans un éditeur hexadécimal, comme certains l’ont suggéré ... vous verrez quelque chose dans la version textuelle comme "I.D. |.". (etc). Le point est l'octet supplémentaire pour chaque caractère.
L'extrait de code ci-dessus semble fonctionner sur mon ordinateur avec ce fichier.
Autres conseils
Le fichier est encodé dans un encodage Unicode, mais vous le lisez en tant qu'ascii. Essayez de convertir le fichier en ascii avant de l’utiliser en python.
Csv n’est-il pas un simple fichier txt avec des valeurs séparées par une virgule. Essayez simplement de l'ouvrir avec un éditeur de texte pour voir si le fichier est correctement formé.
Pour lire un fichier codé, vous pouvez simplement remplacer open
par codecs.open
.
fread = codecs.open('input.csv', 'r', 'utf-16')
Cela ne m'est jamais arrivé, mais comme l'a dit Truppo, il doit y avoir un problème avec le fichier.
Essayez d'ouvrir le fichier dans Excel / BrOffice Calc et enregistrez à nouveau le fichier sous Csv.
Si le problème persiste, essayez un sous-ensemble des données: 10 premières lignes / 10 dernières / 10 lignes intermédiaires du fichier.
Ok, je l’ai obtenu avec l’aide du message de Jarret Hardie
c'est le code que j'ai utilisé pour convertir le fichier en ascii
fread = open('input.csv', 'rb').read()
mytext = fread.decode('utf-16')
mytext = mytext.encode('ascii', 'ignore')
fwrite = open('input-ascii.csv', 'wb')
fwrite.write(mytext)
Merci!
Ouvrez le fichier en mode binaire, 'rb'. Vérifiez-le dans un éditeur HEX et vérifiez le remplissage nul '00'. Ouvrez le fichier dans quelque chose comme Scintilla Text Editor pour vérifier les caractères présents dans le fichier.
Voici le moyen rapide et facile, surtout si python ne va pas analyser correctement l'entrée
sed 's/ \(.\)/\1/g'