2013-05-14 3 views
1

Я пытаюсь преобразовать файлы синтаксиса SPSS в читаемый HTML. Он работает почти отлично, за исключением того, что (один) непечатаемый символ вставляется в файл HTML. Кажется, у него нет кода ASCII и он выглядит как крошечная точка. И это вызывает проблемы.Избегайте непечатаемого символа в html-файле, написанном Python

Это происходит (только) во второй строке HTML-файла, всегда соответствующей первой строке исходного файла. Которые, вероятно, намекает на какой линии (ы) Python вызывают проблемы (см комментарии)

код, который, кажется, вызывает это

rfil = open(fil,"r") #rfil = Read File, original syntax 
    wfil = open(txtFil,"w") #wfil = Write File, HTML output 
    #Line below causes problem?? 
    wfil.write("<ol class='code'>\n<li>") 
    cnt = 0 
    for line in rfil: 
     if cnt == 0: 
      #Line below causes problem?? 
      wfil.write(line.rstrip("\n").replace("'",'&#39;').replace('"','&#34;')) 
     elif len(line) > 1: 
      wfil.write("</li>\n<li>" + line.strip("\n").replace("'",'&#39;').replace('"','&#34;')) 
     else: 
      wfil.write("<br /><br />") 
     cnt += 1 
    wfil.write("</li>\n</ol>") 
    wfil.close() 
    rfil.close() 

Снимок экрана результата

enter image description here

+0

Что означает «причинение вреда» в данном случае? Я фундаменталист-утф-8. Когда вы читаете в python, попробуйте сначала преобразовать его в utf-8 или unicode. Когда вы выписываете, всегда используйте utf-8. Но я действительно не знаю, справляется ли этот совет с вашей проблемой. –

+0

Вы можете удалить файл из непечатаемых файлов, используя: 'import string; ".join (s для s в foo, если s в string.printable)' [Дополнительная информация здесь] (http://stackoverflow.com/a/16402009/1076493) – timss

+0

@AdrianRatnapala: «Причинение проблемы» означает, печатный символ, вероятно, вставлен этой строкой кода Python. Когда я просматриваю последнюю страницу HTML в браузере, она выглядит действительно странно, и именно это я пытаюсь исправить. – RubenGeert

ответ

4

Входной файл, кажется, начинаются с byte order mark (BOM), чтобы указать кодировку UTF-8. Вы можете расшифровать файл строки Unicode, открыв его с

import codecs 
rfil = codecs.open(fil, "r", "utf_8_sig") 

The utf_8_sig кодирования пропускает BOM в начале.

Некоторые программы распознают спецификацию, некоторые - нет. Чтобы записать файл без спецификации, используйте

wfil = codecs.open(txtFil, "w", "utf_8") 
1

Что вы видите byte-order mark, or BOM. Как вы видите, \xef\xbb\xbf, говорит, что stringgs, с которым вы работаете, на самом деле UTF-8; вы можете преобразовать их в правильный Unicode (line.decode('utf-8')), чтобы сделать манипуляции проще.

Затем вы можете дополнить логику для первой линии, так что безопасно удаляет BOM:

for raw_line in rfil: 
    line = raw_line.decode('utf-8') # now line is Unicode 
    if cnt == 0 and line[0] == '\ufeff': 
     line = line[1:] # cut the first character, which is a BOM 
    ... 
+1

'codecs.open ('fname', 'r', 'utf-8-sig')' должен избавиться от 'BOM' – root

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

  • Нет связанных вопросов^_^