Lire et Écrire des fichiers CSV, y compris unicode avec Python 2.7
Je suis nouveau sur Python, et j'ai une question sur la façon d'utiliser Python pour lire et écrire des fichiers CSV. Mon fichier contient, comme l'Allemagne, le français, etc. Selon mon code, les fichiers peuvent être lus correctement en Python, mais quand je l'écris dans un nouveau fichier CSV, l'unicode devient des personnages étranges.
Les données comme:
Et mon code est:
import csv
f=open('xxx.csv','rb')
reader=csv.reader(f)
wt=open('lll.csv','wb')
writer=csv.writer(wt,quoting=csv.QUOTE_ALL)
wt.close()
f.close()
Et le résultat est, comme:
Voulez-vous me dire ce que je dois faire pour résoudre le problème? Merci beaucoup!
- vous pouvez encoder en base64, pythn a un module pour ça aussi.
- J'utilise cette github.com/jdunck/python-unicodecsv
- De quelle source et de destination de codage utilisez-vous pour vos fichiers? Unicode est pas un encodage (sauf si vous êtes Microsoft...mais ils signifient vraiment UTF-16LE).
- Merci beaucoup! Je voudrais essayer.
- Merci beaucoup! J'ai essayé le code dans le lien, mais ça ne fonctionne toujours pas. En fait, tout est très bien lorsque je l'importation de données et imprimer des données en Python. Mais après, je ne les écris dans le nouveau fichier csv, les caractères spéciaux modification chose d'étrange. Avez-vous une idée de ce?
- Merci beaucoup! Il semble ne pas faire de changements. En fait, tout est très bien lorsque je l'importation de données et imprimer des données en Python. Mais après, je ne les écris dans le nouveau fichier csv, les caractères spéciaux modification chose d'étrange. Est-il possible d'être causés par les paramètres de langue ou de système informatique? Merci beaucoup!
- Êtes-vous sur de Windows? L'encodage que vous utilisez pour les fichiers? De nombreux programmes windows que lire les fichiers UTF-8 comme une NOMENCLATURE de signature au début d'un fichier UTF-8. Utiliser le
utf-8-sig
d'encodage lors de l'écriture du fichier à s'assurer que l'un est écrit. - essayez "latin1", comme le type de codage lorsque vous ouvrez le fichier ... qui sera très souvent de résoudre le problème lorsque vous traitez avec les langues européennes
- Merci beaucoup! Je suis sur Windows. Mais où dois-je spécifier l'encodage utf-8-sig?
- Merci de vous répondre. où dois-je changer le type d'encodage?
- J'ai mis à jour ma réponse ci-dessous pour utiliser
utf-8-sig
lors de la lecture ou de l'écriture du fichier à assurer une NOMENCLATURE signature est ajoutée au fichier. Par exemple, si j'ouvre le fichier dans Excel sans BOM, je reçois美国人
, mais avec ce que je reçois美国人
. - Merci beaucoup! Ça marche!!!!
- Super! Assurez-vous d'accepter une réponse si cela vous aide.
Vous devez vous connecter pour publier un commentaire.
Assurez-vous d'encoder et de décoder comme approprié.
Cet exemple, aller quelques exemple de texte en utf-8 vers un fichier csv et de les renvoyer à démontrer:
Imprime:
u'Straße'
, ils sont toujours (les caractères d'échappement) ASCII en interne (u'Stra\xdfe'
), de sorte que vous avez à traduire ou à coder tout en UTF-8 (échappé de chaînes de caractères) ('Stra\xc3\x9fe'
) avant de les écrire sur une codé en UTF-8 fichier?Une autre alternative:
Utiliser le code de la unicodecsv paquet ...
https://pypi.python.org/pypi/unicodecsv/
Ce module API est compatible avec les STDLIB csv module.
Il est un exemple à la fin de la csv documentation du module qui montre comment traiter avec Unicode. Ci-dessous est copié directement à partir de ce exemple. Notez que les chaînes de lecture ou d'écriture seront des chaînes Unicode. Ne pas passer une chaîne d'octets à
UnicodeWriter.writerows
, par exemple.D'entrée (UTF-8):
De sortie:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
surself.writer.writerow([s.encode("utf-8") for s in row])
cette ligne. S'il vous plaît suggérer?UnicodeDecodeError
. Cela implique ques
n'était pas Unicode pour commencer, de sorte que Python 2.X est du décodage Unicode à l'aide de la valeur par défautascii
codec. Assurez-vous que vous êtes de passage des chaînes Unicode pourUnicodeWriter
.Parce que
str
en python2 estbytes
en fait. Donc, si vous voulez écrireunicode
au format csv, vous devez coderunicode
àstr
à l'aide deutf-8
encodage.Utilisation
class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
:csvfile
:open(fp, 'w')
bytes
qui sont codés avecutf-8
writer.writerow({py2_unicode_to_str(k): py2_unicode_to_str(v) for k,v in row.items()})
csvfile
:open(fp, 'w')
str
commerow
àwriter.writerow(row)
Enfin code
Conclusion
En python3, il suffit d'utiliser l'unicode
str
.En python2, utilisez
unicode
manipuler du texte, utilisezstr
lors de l'I/O se produit.J'ai eu le même problème. La réponse est que vous êtes en train de faire déjà. C'est le problème de MS Excel. Essayez d'ouvrir le fichier avec un autre éditeur et vous remarquerez que votre encodage est déjà réussie. Pour faire de MS Excel heureux, passer de l'UTF-8, UTF-16. Cela devrait fonctionner:
Je ne pouvais pas répondre à la Marque au-dessus, mais je viens de faire une modification qui a corrigé l'erreur qui a été causé si les données dans les cellules n'était pas unicode, c'est à dire à flotteur ou de données int. J'ai remplacé cette ligne dans le UnicodeWriter fonction: "l'auto.de l'écrivain.writerow([s.encode("utf-8") if type(s)==types.UnicodeType d'autre s pour s en ligne])", de sorte qu'il est devenu:
Vous aurez également besoin d'importer des types".