2014-09-12 5 views
3

В настоящее время я пишу скрипт для конвертирования кучи XML-файлов из разных кодировок в унифицированный UTF-8.Написание XML-заголовка с LXML

я сначала попытаться определить кодировку с помощью LXML:

def get_source_encoding(self): 
    tree = etree.parse(self.inputfile) 
    encoding = tree.docinfo.encoding 
    self.inputfile.seek(0) 
    return (encoding or '').lower() 

Если это пустое, я пытаюсь получить его от chardet:

def guess_source_encoding(self): 
    chunk = self.inputfile.read(1024 * 10) 
    self.inputfile.seek(0) 
    return chardet.detect(chunk).lower() 

то я использую codecs преобразовать кодировку файла:

def convert_encoding(self, source_encoding, input_filename, output_filename): 
    chunk_size = 16 * 1024 

    with codecs.open(input_filename, "rb", source_encoding) as source: 
     with codecs.open(output_filename, "wb", "utf-8") as destination: 
      while True: 
       chunk = source.read(chunk_size) 

       if not chunk: 
        break; 

       destination.write(chunk) 

И наконец, я пытаюсь переписать заголовок XML. Если заголовок XML был первоначально

<?xml version="1.0"?> 

или

<?xml version="1.0" encoding="windows-1255"?> 

Я хотел бы превратить его в

<?xml version="1.0" encoding="UTF-8"?> 

Мой текущий код не похоже на работу:

def edit_header(self, input_filename): 
    output_filename = tempfile.mktemp(suffix=".xml") 

    with open(input_filename, "rb") as source: 
     parser = etree.XMLParser(encoding="UTF-8") 
     tree = etree.parse(source, parser) 

     with open(output_filename, "wb") as destination: 
      tree.write(destination, encoding="UTF-8") 

Файл, который я сейчас тестировал, имеет заголовок th at не указывает кодировку. Как я могу заставить его правильно выводить заголовок с указанной кодировкой?

+0

Зачем вам нужно, что спецификация кодирования на выходе? –

+0

Мне нравится быть ... подробным об этих вещах. –

ответ

4

Try:

tree.write(destination, xml_declaration=True, encoding='UTF-8') 

От the API docs:

xml_declaration управления, если декларация XML должна быть добавлена ​​в файл. Используйте False для никогда, True для всегда, None только в том случае, если не US-ASCII или UTF-8 (по умолчанию None).

Пример из IPython:

In [15]: etree.ElementTree(etree.XML('<hi/>')).write(sys.stdout, xml_declaration=True, encoding='UTF-8') 
<?xml version='1.0' encoding='UTF-8'?> 
<hi/> 

Поразмыслив, я думаю, что вы пытаетесь слишком трудно. lxml автоматически определяет кодировку и правильно анализирует файл в соответствии с этой кодировкой.

Так все, что вам действительно нужно сделать (по крайней мере, в python2.7) является:

def convert_encoding(self, source_encoding, input_filename, output_filename): 
    tree = etree.parse(input_filename) 
    with open(output_filename, 'w') as destination: 
     tree.write(destination, encoding='utf-8', xml_declaration=True) 
+0

Насколько хорошо в кодировании угадывание/трансформация? Я хотел быть уверенным, что это правильно изменит ситуацию. –

+0

Он работал над одним тестом, который я пробовал. –

+0

У меня есть файлы с заголовком '' Без отображения кодировки, которая является 'windows-1255', поэтому я не уверен, насколько она будет работать. –

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