2017-06-08 5 views
0

主にutf-8でエンコードされたPythonプロジェクト用に私自身のcookiecutter templateを作成しています。しかし、ファイルには.ini.phpがiso-8859-1(latin1)でエンコードされています。このリソースは、従来のコードの一部であるため、latin1でエンコードする必要があります。もちろんiso-8859-1(latin1)文字を含むCookiecutterテンプレート

Traceback (most recent call last): 
    ... 
    File ".../lib/python2.7/site-packages/cookiecutter/cli.py", line 123, in main 
    default_config=default_config, 
    File ".../lib/python2.7/site-packages/cookiecutter/main.py", line 91, in cookiecutter 
    output_dir=output_dir 
    File ".../lib/python2.7/site-packages/cookiecutter/generate.py", line 349, in generate_files 
    generate_file(project_dir, infile, context, env) 
    File ".../lib/python2.7/site-packages/cookiecutter/generate.py", line 166, in generate_file 
    tmpl = env.get_template(infile_fwd_slashes) 
    File ".../lib/python2.7/site-packages/jinja2/environment.py", line 830, in get_template 
    return self._load_template(name, self.make_globals(globals)) 
    File ".../lib/python2.7/site-packages/jinja2/environment.py", line 804, in _load_template 
    template = self.loader.load(self, name, globals) 
    File ".../lib/python2.7/site-packages/jinja2/loaders.py", line 113, in load 
    source, filename, uptodate = self.get_source(environment, name) 
    File ".../lib/python2.7/site-packages/jinja2/loaders.py", line 175, in get_source 
    contents = f.read().decode(self.encoding) 
    File ".../lib/python2.7/encodings/utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 308: invalid continuation byte 

、結果が部分的に生成され、ISO-8859の解析で中断された:私は、コード生成中に次のエラーいる

cookiecutter cookiecutter-mytemplate # <- directory of my project 

は、私が実行すると、 -1ファイル(内側に "é"が付いています)。

テンプレートを生成する前にリソースをutf-8に変換してからiso-8859-1に変換するためにプリ/ポストフックを使用できますか?そしてどうやって?

utf-8以外のファイルを処理する方法はありますか?

答えて

0

最後に、.ini.phpのすべてのファイルをutf-8に保存し、フックを使用して、生成後のファイルをiso-8859-1に変換します。ここで

hooks/post_gen_project.pyのコードです:

# coding: utf-8 
from __future__ import print_function, unicode_literals 

import io 
import os 


def convert_resources(src_dir): 
    if "src" in os.listdir(src_dir): 
     src_dir = os.path.join(src_dir, "src") 
    print("src_dir: " + src_dir) 

    for root_dir, dirnames, filenames in os.walk(src_dir): 
     for filename in filenames: 
      ext = os.path.splitext(filename)[1] 
      if ext in ('.ini', '.php'): 
       src_path = os.path.join(root_dir, filename) 
       print(" Converting '{relpath}'...".format(relpath=os.path.relpath(src_path, src_dir))) 
       with io.open(src_path, mode="r", encoding="utf-8") as fd: 
        content = fd.read() 
       with io.open(src_path, mode="w", encoding="iso-8859-1") as fd: 
        fd.write(content) 


if __name__ == '__main__': 
    convert_resources(os.getcwd()) 
関連する問題