2015-12-27 16 views
5

Sto tentando di eseguire l'analisi del testo su testi cinesi. Il programma è fornito di seguito. Ho ottenuto il risultato con caratteri illeggibili come 浜烘皯鏃ユ姤绀捐. E se cambio il file di output result.csv a result.txt, i caratteri sono corretti come 人民日报社论. Quindi cosa c'è di sbagliato in questo? Non riesco a capire. Ho provato diversi modi tra cui aggiungere decoder e encoder.Python CSV scrive su file illeggibile in Excel (caratteri cinesi)

# -*- coding: utf-8 -*- 
    import os 
    import glob 
    import jieba 
    import jieba.analyse 
    import csv 
    import codecs 

    segList = [] 
    raw_data_path = 'monthly_raw_data/' 
    file_name = ["201010", "201011", "201012", "201101", "201103", "201105", "201107", "201109", "201110", "201111", "201112", "201201", "201202", "201203", "201205", "201206", "201208", "201210", "201211"] 

    jieba.load_userdict("customized_dict.txt") 

    for name in file_name: 
     all_text = "" 
     multi_line_text = "" 
     with open(raw_data_path + name + ".txt", "r") as file: 
      for line in file: 
       if line != '\n': 
        multi_line_text += line 
      templist = multi_line_text.split('\n') 
      for text in templist: 
       all_text += text 
      seg_list = jieba.cut(all_text,cut_all=False) 
      temp_text = [] 
      for item in seg_list: 
       temp_text.append(item.encode('utf-8')) 

      stop_list = [] 
      with open("stopwords.txt", "r") as stoplistfile: 
       for item in stoplistfile: 
        stop_list.append(item.rstrip('\r\n')) 

      text_without_stopwords = [] 
      for word in temp_text: 
       if word not in stop_list: 
        text_without_stopwords.append(word) 

      segList.append(text_without_stopwords) 


    with open("results/result.csv", 'wb') as f: 
     writer = csv.writer(f) 
     writer.writerows(segList) 
+0

Come si rileva che i caratteri sono "illeggibili". Si apre il file CSV con Excel? Guardalo dentro con uno strumento a riga di comando come 'less'? Aprilo con un editor di testo? –

+0

Sì, lo apro con Excel, se cambio il file 'result.csv' in' result.txt', posso leggere tutti i caratteri. E 'molto strano. – flyingmouse

+1

Excel presenta un problema in cui vengono manipolati caratteri speciali. Prova ad aprire result.csv nel blocco note ++ per esempio e vedere se è corretto. – Untitled123

risposta

6

Per codifica UTF-8, Excel richiede BOM (byte order mark) Codepoint scritto all'inizio del file o si assumerà ANSI codifica, che è dipendente dal luogo. U+FEFF è il BOM Unicode. Ecco un esempio che si aprirà correttamente in Excel:

#!python2 
#coding:utf8 
import csv 

data = [[u'American',u'美国人'], 
     [u'Chinese',u'中国人']] 

with open('results.csv','wb') as f: 
    f.write(u'\ufeff'.encode('utf8')) 
    w = csv.writer(f) 
    for row in data: 
     w.writerow([item.encode('utf8') for item in row]) 

Per completezza, Python 3 rende tutto più semplice. Nota: il parametro newline='' invece della codifica wb e utf-8-sig aggiunge automaticamente una BOM. Le stringhe Unicode vengono scritte direttamente invece di dover codificare ogni elemento.

#!python3 
#coding:utf8 
import csv 

data = [[u'American',u'美国人'], 
     [u'Chinese',u'中国人']] 

with open('results.csv','w',newline='',encoding='utf-8-sig') as f: 
    w = csv.writer(f) 
    w.writerows(data) 

C'è anche il 3 ° modulo di partito unicodecsv che rende Python 2 più facile così:

#!python2 
#coding:utf8 
import unicodecsv 

data = [[u'American',u'美国人'], 
     [u'Chinese',u'中国人']] 

with open('results.csv','wb') as f: 
    w = unicodecsv.writer(f,encoding='utf-8-sig') 
    w.writerows(data) 
+0

Ho ricevuto un errore usando il tuo primo codice (Python 2.x): 'UnicodeDecodeError: il codec 'ascii' non può decodificare il byte 0xe4 in posizione 0: ordinale non compreso nell'intervallo (128)' – flyingmouse

+0

@flyingmouse, assicurarsi di codificare le stringhe Unicode e non le stringhe di byte. Se chiamate '.encode ('utf8')' su una stringa di byte, Python 2 eseguirà un '.decode ('ascii')' implicito per provare a trasformarlo prima in una stringa Unicode. –

0

Ecco un altro modo un po 'complicato:

#!python2 
#coding:utf8 
import csv 

data = [[u'American',u'美国人'], 
     [u'Chinese',u'中国人']] 

with open('results.csv','wb') as f: 
    f.write(u'\ufeff'.encode('utf8')) 
    w = csv.writer(f) 
    for row in data: 
     w.writerow([item.encode('utf8') for item in row]) 

Questo blocco di codice generare il file CSV codificato utf-8.

  1. aprire il file con notepad ++ (o altro editor con funzionalità di codifica)
  2. Encoding ->convertire ANSI
  3. Salva

Aprire il file con Excel, è OK.

Problemi correlati