0

文字列データ(UTF-8)、バイナリ(true / false / 1/0)、および整数データを含むタプルがあり、出力ファイルに行として出力します。私のコードの一部は次のとおりです。

###  Python 2.73

import fileinput
import re
import time
import codecs

uIDfile = '\Python\Fav Test\ppl.ttxt'

InFile = open(uIDfile)
OutFile = codecs.open('C:\Python\Fav Test\S2.ttxt', encoding='utf-8', mode='w')

for user in InFile:
    user = user [:-1]
#   user = unicode(user, 'utf-8').encode('utf-8')

    if 'NNNN' in user:
        break
    else:
        if '@N' in user:
            try:
                Grp = people_getGroups(user_id = user)
                g = 0
                if GetAll:
                    for group in Grp.find('groups').findall('group'):

                        g += 1
                        fErr = ''
                        uID  = user
                        gID  = group.get('ID')
                        gName  =  group.get('name')
                        tup = '\"{0}\"\t\"{2}\"\t\"{1}\"\t''\t{3}\t{4}\t{5}\t{6}\n'.format(uNSID, gNSID, gName, bin1, bin2, int1, int2)
                        OutFile.write(tup.encode('utf-8'))

「OutFile.write()」ステートメントのいくつかの異なるバージョンを試しました。エラーはそれぞれ以下にリストされています。

OutFile.write(codecs.utf_8_decode(tup.encode('utf-8')))
    TypeError: coercing to Unicode: need string or buffer, tuple found

OutFile.write('\t'.join(codecs.utf_8_decode(tup.encode('utf-8'))))
    TypeError: sequence item 1: expected string or Unicode, int found

OutFile.write('\t'.join(map(str, codecs.utf_8_decode(tup.encode('utf-8')))))
    tup = '\"{0}\"\t\"{2}\"\t\"{1}\"\t""\t\"{3}\"\t\"{4}\"\t\"{5}\"\t\"{6}\"\n'.format(uNSID, gNSID, gName, str(bin1), str(bin2), str(int1), str(int2))
    UnicodeEncodeError: "'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)"

OutFile.write('\t'.join(map(str, codecs.utf_8_decode(tup.encode('utf-8')))))
    tup = '\"{0}\"\t\"{2}\"\t\"{1}\"\t""\t\"{3}\"\t\"{4}\"\t\"{5}\"\t\"{6}\"\n'.format(uNSID, gNSID, gName, bin1, bin2, int1, int2)
    UnicodeEncodeError: "'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)"

どんな助けでも心から感謝します!

4

1 に答える 1

1

行をファイルに出力したい場合は、csv モジュールを使用することをお勧めします。使用方法の例を次に示します。

#-*- coding: utf-8 -*-
import csv
# Use of tempfile instead of hard-coded path, to be cross-platform :)
import tempfile
_, tmppath = tempfile.mkstemp()
out = open(tmppath, 'w')
writer = csv.writer(out)
input = "Te×t Ðåtå".decode('utf-8')
tup = (input.encode('utf-8'), 42, False)
tup
# OUT: ('Te\xc3\x97t \xc3\x90\xc3\xa5t\xc3\xa5', 42, False)
writer.writerow(tup)
out.close()
print(u"Look at me : {}".format(tmppath))

Dialects および Formatting Parametersを使用して、出力ファイルをどのようにフォーマットする必要があるかを正確に定義できます。

これらの適切なスライドで説明されているように、UTF8 のジャミングを回避するための推奨事項は次のとおりです。

  • 早めにデコード
  • どこでもユニコード
  • 遅くエンコードする
于 2013-02-27T10:28:22.493 に答える