3

Facebook の連絡先のメール アドレスを GMail/Android にインポートできるようにする小さなスクリプトを書いています。私の入力ファイルには、Jasmin L\u00f3pez のような Unicode 文字が含まれています。生成された CSV 出力ファイルは次のようになります。

Andr\u00e9 Zzz,,,,,,,,,,,,,,,,,,,,,,,fbcontacts ::: * 私の連絡先,* ホーム,zzz@yahoo.com
Andr\u00e9ia Ggg ,,,,,,,,,,,,,,,,,,,,,,,,fbcontacts ::: * 私の連絡先,* ホーム,ggg@hotmail.com
Andr\u00e9s Bbb,,,, ,,,,,,,,,,,,,,,,,,,,fbcontacts ::: * 私の連絡先,* ホーム,bbb@gmail.com

ご覧のとおり、エンコーディングに問題があります。Google 連絡先の CSV ファイルを作成していますが、名前を正しく表示する必要があります。この関数を使用して CSV を記述しています。

def writecsv(self):
    if self.outfile is not '':
        #fh = open(self.outfile, 'wb')
        #fh = codecs.open(self.outfile, "wb", "utf-8")
        fh = codecs.open(self.outfile, 'wb', encoding="latin-1")
    else:
        fh = sys.stdout

    csvhdlr = csv.writer(fh, quotechar='"', quoting=csv.QUOTE_MINIMAL)
    csvhdlr.writerow("Name,Given Name,Additional Name,Family Name,Yomi Name,Given Name Yomi,Additional Name Yomi,Family Name Yomi,Name Prefix,Name Suffix,Initials,Nickname,Short Name,Maiden Name,Birthday,Gender,Location,Billing Information,Directory Server,Mileage,Occupation,Hobby,Sensitivity,Priority,Subject,Notes,Group Membership,E-mail 1 - Type,E-mail 1 - Value".split(','))        
    for contact in self.clist:
        #csvhdlr.writerow(dict((vname, vtype, vnotes, vstereotype, vauthor, valias, vgenfile.encode('utf-8')) for vname, vtype, vnotes, vstereotype, vauthor, valias, vgenfile in row.iteritems()))
        row = contact.fullname + ',,,,,,,,,,,,,,,,,,,,,,,,,,fbcontacts ::: * My Contacts,* Home,' + contact.email
        csvhdlr.writerow(row.split(','))

何かアイデアはありますか?私はPythonを初めて使用し、エンコーディングを使用する必要があるたびに、私が望むように機能しません=(

助けてくれてどうもありがとう!

4

1 に答える 1

3

私の理解が正しければ、あなたのファイルには高度な Unicode 文字が含まれていません。高いユニコード文字を表す "\u00f3" のようなユニコード エスケープ シーケンスが含まれているだけです。ファイルに実際に文字列 "Jasmin L\u00f3pez" (リテラル バックスラッシュと u) が含まれている場合は、それを書き込む前に実際の Unicode 文字にデコードする必要があります。unicode_escapeコーデックを見てみましょう。

>>> x = b"\u00f3"
>>> print x
\u00f3
>>> print x.decode('unicode_escape')
ó
于 2012-09-21T18:25:40.277 に答える