2015-06-25 3 views
1

Я прочитал несколько сообщений о записи Python в текстовые файлы, но не смог найти решение моей проблемы. Здесь это в двух словах.Запись в текстовый файл UTF-16-LE с спецификацией

Требование: записывать значения, разделенные символами шипа (u00FE; и выравнивание текстовых значений), и символ пикрова (u00B6; после каждого столбца) в текстовый файл UTF-16LE с спецификацией (FF FE).

Проблема: Письменный текстовый файл имеет пробел между каждым столбцом, для которого я не выполнял сценарий. Кроме того, он не отображается прямо в UltraEdit. Отображается только первое значение («мама»). Я приветствую любое понимание или совет.

Сценарий (упрощенный, чтобы облегчить поиск и устранение неисправностей, фактический скрипт использует сторонние API для получения списка значений):

import os 
import codecs 
import shutil 
import sys 
import codecs 

first = u'' 
textdel = u'\u00FE'.encode('utf_16_le') #thorn 
fielddel = u'\u00B6'.encode('utf_16_le') #pilcrow 
list1 = ['mom', 'dad', 'son'] 
num = len(list1) #pretend this is from the metadata profile 

f = codecs.open('c:/myFile.txt', 'w', 'utf_16_le') 
f.write(u'\uFEFF') 
for item in list1: 
    mytext2 = u'' 
    i = 0 
    i = i + 1 
    mytext2 = mytext2 + item + textdel 
    if i < (num - 1): 
    mytext2 = mytext2 + fielddel 
    f.write(mytext2 + u'\n') 

f.close() 

ответ

2

Вы дважды кодирующими ваши строки. Вы уже открыли свой файл как UTF-16-LE, поэтому оставьте свои textdel и fielddel строки незакодированными. Они будут закодированы во время записи вместе с каждой строкой, записанной в файл.

Или иначе говоря, textdel = u'\u00FE' наборов textdel к «шип» характер, в то время как textdel = u'\u00FE'.encode('utf-16-le') наборов textdel к определенной последовательной форме этого символа, последовательности байт в соответствии с этим кодеком; он больше не является последовательность символов :

textdel = u'\u00FE' 
len(textdel)      # -> 1 
type(textdel)      # -> unicode 
len(textdel.encode('utf-16-le')) # -> 2 
type(textdel.encode('utf-16-le')) # -> str 
+0

Дерек: Спасибо большое за этот ответ и вы абсолютно правы на ошибку дважды кодирования я делаю. – stan1220

+0

@ stan1220: вы очень желанны! Поскольку это сработало для вас, вы отметите ответ как «принятый»? Благодаря! –

Смежные вопросы