<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Love web applications &#187; Python</title>
	<atom:link href="http://blog.hitsuji.me/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.hitsuji.me</link>
	<description>Webアプリつくるの楽しい！つくるネタ、使うネタ、あとは雑談です。</description>
	<lastBuildDate>Sun, 25 Jan 2015 12:49:45 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>JSONファイルをCSVファイルに変換する</title>
		<link>http://blog.hitsuji.me/read-json-conv-2-dimension-list-and-write-it-to-csv/</link>
		<comments>http://blog.hitsuji.me/read-json-conv-2-dimension-list-and-write-it-to-csv/#comments</comments>
		<pubDate>Tue, 22 Jul 2014 12:38:37 +0000</pubDate>
		<dc:creator><![CDATA[kapibarawebmaster1515]]></dc:creator>
				<category><![CDATA[データ処理]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.hitsuji.me/?p=132</guid>
		<description><![CDATA[こんにちは。梅雨明けしたいも関わらず、ジトジトして不快指数が高いお天気が続きますね。でも湿気に負けないで今日もブログを更新しようと思います！ &#160; さて、今日は以前書いた記事「Perlで横浜市・・・<a class="readon" href="http://blog.hitsuji.me/read-json-conv-2-dimension-list-and-write-it-to-csv/">続きを読む</a>]]></description>
				<content:encoded><![CDATA[<p>こんにちは。梅雨明けしたいも関わらず、ジトジトして不快指数が高いお天気が続きますね。でも湿気に負けないで今日もブログを更新しようと思います！</p>
<p>&nbsp;</p>
<p>さて、今日は<a title="Perlで横浜市の区別年齢別人口データを自動入手する" href="http://blog.hitsuji.me/get-stat-of-yokohama-city-population-automatically/">以前書いた記事「Perlで横浜市の区別年齢別人口データを自動入手する」</a>で入手したJSONファイルをCSVファイルに変換します。何故CSVにしたいかと言えば、<a title="横浜市地図に区名を表示する" href="http://blog.hitsuji.me/show-yokohama-city-map-divided-into-administrative-divisions-with-its-each/">その前に書いた記事「横浜市地図に区名を表示する」</a>で紹介した横浜市地図に人口データを反映させるための情報に編集し直す必要があり、一旦CSVにした方が編集作業が便利そうだからです。</p>
<p>&nbsp;</p>
<h4>JSONファイルを読み込んで、CSVとして書き出す</h4>
<p>横浜市の人口データが入っているJSONファイルを読み込み、２次元テーブルに変換して、CSVとしてファイル出力するスクリプトをPythonで書きました。汎用性のあるコードにしたかったのですが、結構手間取りそうだったので、今回扱うJSONファイルの構造に依存した処理になっています。</p>
<p>&nbsp;</p>
<h6>conv_json_to_csv.py</h6>
<script src="https://gist.github.com/f4fb6867e0ff23a7020a.js"></script><noscript><pre><code class="language-python python">#coding:utf-8
'''
Created on 2014/7/20

@author: Tae Matsumoto
JSONファイルを読み込み、同名のCSVファイルを出力します。
読み込む対象のJSONファイルの構造は下記の通り。
[{'key':区名1, 'stat':{0:0歳人口,1:1歳人口,...}},{'key':区名2, 'stat':{0:0歳人口,1:1歳人口,...}},...]
'''

import csv, json

filename = 'yokohama_stat'

# read json file.
json_data = open(filename+'.json')
data = json.load(json_data)
json_data.close()

res = list()

# add header
tmp = list(data[0]['stat'].items()) + [('key', data[0]['key'])]
tmp.sort()
header = [x[0] for x in tmp]
res.append(header)

# add elements
for row in data:
    row_list = list(row['stat'].items()) + [('key', row['key'])]
    row_list.sort()
    vals = [x[1] for x in row_list]
    res.append(vals)

# display resulsts
print res

# write a file as csv
with open(filename+'.csv', 'wb') as f:
    mywriter = csv.writer(f, delimiter = ',')
    mywriter.writerows(res)
    f.close()
</code></pre></noscript>
<p>&nbsp;</p>
<p>ここではCSVにするためにDictionary型のデータを２次元データに書き換えています。</p>
<p>L32の書き方は便利で、</p>
<pre class="command">[x[1] for x in row_list]</pre>
<p>は、[(x0,y0),(x1,y1),(x2,y2),&#8230;]という形式のリストのうち、第二要素のみを取り出して</p>
<pre class="command">[y0,y1,y2,...]</pre>
<p>と整理してくれます。<a title="how-to-extract-the-n-th-elements-from-a-list-of-tuples-in-python" href="http://stackoverflow.com/questions/3308102/how-to-extract-the-n-th-elements-from-a-list-of-tuples-in-python" target="_blank">=&gt;stackoverflow</a></p>
<p>&nbsp;</p>
<p>以上で、横浜市の0-5歳児の人口データが入ったCSVファイルが出来上がりました。</p>
<p>&nbsp;</p>
<p>次は、<a title="区名と行政団体コードを書き並べたCSVからJSONファイルを作成する" href="http://blog.hitsuji.me/convert-csv-listing-words-name-and-their-codes-to-json/">以前の記事「区名と行政団体コードを書き並べたCSVからJSONファイルを作成する」</a>で作成したCSVファイルと合わせてExcelで編集して次のようにまとめます。</p>
<p>&nbsp;</p>
<script src="https://gist.github.com/d5a9e70d4bcb5671fb3e.js"></script><noscript><pre><code class="language-csv csv">cityid,name,demographics-0,demographics-1,demographics-2,demographics-3,demographics-4,demographics-5,ttlid141011,鶴見区,2712,2875,2812,2589,2518,2525,280234id141020,神奈川区,2037,1960,1971,1916,1736,1812,234496id141038,西区,869,854,809,746,733,692,97251id141046,中区,1112,1150,1052,1081,942,975,147065id141054,南区,1351,1419,1356,1385,1369,1409,194393id141119,港南区,1551,1660,1682,1715,1779,1730,217782id141062,保土ヶ谷区,1432,1469,1485,1542,1444,1492,204290id141127,旭区,1853,1912,1934,2016,2039,1981,248560id141071,磯子区,1261,1360,1280,1257,1314,1363,161968id141089,金沢区,1362,1481,1547,1583,1569,1670,204453id141097,港北区,3455,3294,3122,2885,2758,2721,338969id141135,緑区,1519,1602,1602,1670,1652,1563,178783id141178,青葉区,2614,2780,2644,2777,2766,2812,307844id141186,都筑区,2120,2235,2441,2341,2451,2279,209626id141101,戸塚区,2384,2494,2472,2517,2474,2559,273962id141151,栄区,972,986,1014,972,1004,1018,123176id141160,泉区,1204,1295,1255,1318,1313,1350,154807id141143,瀬谷区,1006,1028,1046,1013,1069,1125,125599</code></pre></noscript>
<p>&nbsp;</p>
<p>これを、同じく<a title="区名と行政団体コードを書き並べたCSVからJSONファイルを作成する" href="http://blog.hitsuji.me/convert-csv-listing-words-name-and-their-codes-to-json/">「区名と行政団体コードを書き並べたCSVからJSONファイルを作成する」</a>で書いたスクリプトを使って、JSONファイルに変換します。</p>
<p>&nbsp;</p>
<p>これで、区名＆人口データが入ったJSONファイルが出来上がりました。</p>
<p>次回はこのファイルを使って、横浜市地図を塗り分けようと思います！</p>
<p>&nbsp;</p>
<p>それでは♪</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hitsuji.me/read-json-conv-2-dimension-list-and-write-it-to-csv/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>区名と行政団体コードを書き並べたCSVからJSONファイルを作成する</title>
		<link>http://blog.hitsuji.me/convert-csv-listing-words-name-and-their-codes-to-json/</link>
		<comments>http://blog.hitsuji.me/convert-csv-listing-words-name-and-their-codes-to-json/#comments</comments>
		<pubDate>Sat, 14 Jun 2014 12:33:56 +0000</pubDate>
		<dc:creator><![CDATA[kapibarawebmaster1515]]></dc:creator>
				<category><![CDATA[可視化]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[UTF-8]]></category>

		<guid isPermaLink="false">http://blog.hitsuji.me/?p=94</guid>
		<description><![CDATA[こんばんは。今日は、横浜市の区名と&#8221;id&#8221;+行政団体コードをリストアップしたCSVファイルから、JSONファイルにコンバートします。これを後に、TopoJSONファイルと一緒に・・・<a class="readon" href="http://blog.hitsuji.me/convert-csv-listing-words-name-and-their-codes-to-json/">続きを読む</a>]]></description>
				<content:encoded><![CDATA[<p>こんばんは。今日は、横浜市の区名と&#8221;id&#8221;+行政団体コードをリストアップしたCSVファイルから、JSONファイルにコンバートします。これを後に、TopoJSONファイルと一緒に読み込んで、横浜市地図のラベル表示に使う訳です。（地図表示については、<a title="横浜市地図の各区に１つだけラベル表示する" href="http://blog.hitsuji.me/show-yokohama-city-map-with-label-of-unique-id/">前回までの記事</a>を読んでね）</p>
<p>&nbsp;</p>
<h4>CSVファイルを用意する</h4>
<p>区名と団体コードをリストアップしたCSVファイルをUTF-8エンコードで作成します。ちなみに、もしあなたがMac使いなら、NumbersでUTF-8でさくっと出力することができます。Excelだとshift-jisが基本なので、適当なエディタでUTF-8に変換してくださいねー</p>
<h6>yokohama_codes.csv</h6>
<script src="https://gist.github.com/41f4f657f8fb67184a44.js"></script><noscript><pre><code class="language-csv csv">cityid,name
id141011,鶴見区
id141020,神奈川区
id141038,西区
id141046,中区
id141054,南区
id141062,保土ヶ谷区
id141071,磯子区
id141089,金沢区
id141097,港北区
id141101,戸塚区
id141119,港南区
id141127,旭区
id141135,緑区
id141143,瀬谷区
id141151,栄区
id141160,泉区
id141178,青葉区
id141186,都筑区</code></pre></noscript>
<p>&nbsp;</p>
<h4>PythonでCSVからJSONに変換する</h4>
<p>１行目はカラム名と見なして要素名とし、行毎にDictionaryを作成、Listにポンポン入れて最後にJSON形式で書き出します。</p>
<h6>conv_csv_to_json.py</h6>
<script src="https://gist.github.com/82743ce5eecbf1b02c69.js"></script><noscript><pre><code class="language-python python">#coding:utf-8
'''
Created on 2014/03/27

@author: Tae Matsumoto
CSVファイルを読み込み、同名のJSONファイルを出力します。
'''

import csv, json

filename = 'yokohama_codes'

header = []
data = []

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
    # csv.py doesn't do Unicode; encode temporarily as UTF-8:
    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),dialect=dialect, **kwargs)
    for row in csv_reader:
        # decode UTF-8 back to Unicode, cell by cell:
        yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')

with open(filename + '.csv', 'rU') as csvfile:
    spamreader = unicode_csv_reader(csvfile, dialect=csv.excel)
    is_first = True
    
    for row in spamreader:
        if is_first:
            header = row[:]
            is_first = False
            continue
        items = {}
        for i in range(0, len(row)):
            item = row[i]
            items[header[i]] = item
        data.append(items)

with open(filename+'.json', 'w') as f:
    json.dump(data, f, ensure_ascii=False, indent=2, encoding='utf8')
    f.close()
</code></pre></noscript>
<p>&nbsp;</p>
<p>JSONファイルに日本語が含まれるので、json.dumpにensure_ascii=falseとencoding=&#8217;utf8&#8217;を指定します。</p>
<p><a title="saving-utf-8-texts-in-json-dumps-as-utf8-not-as-u-escape-sequence" href="http://stackoverflow.com/questions/18337407/saving-utf-8-texts-in-json-dumps-as-utf8-not-as-u-escape-sequence" target="_blank">http://stackoverflow.com/questions/18337407/saving-utf-8-texts-in-json-dumps-as-utf8-not-as-u-escape-sequence</a></p>
<p>&nbsp;</p>
<p>上手くできました♥︎</p>
<p>次回は、今日作成したJSONファイルと前回作成した地図をMixして、横浜市地図に区名ラベルを表示できるようにしたいと思います。</p>
<p>それでは、また♪</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hitsuji.me/convert-csv-listing-words-name-and-their-codes-to-json/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>区名を英数字コードに置換する</title>
		<link>http://blog.hitsuji.me/replacement-from-word-name-to-its-code/</link>
		<comments>http://blog.hitsuji.me/replacement-from-word-name-to-its-code/#comments</comments>
		<pubDate>Tue, 03 Jun 2014 14:17:58 +0000</pubDate>
		<dc:creator><![CDATA[kapibarawebmaster1515]]></dc:creator>
				<category><![CDATA[可視化]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TopoJSON]]></category>

		<guid isPermaLink="false">http://blog.hitsuji.me/?p=65</guid>
		<description><![CDATA[こんばんは。この記事執筆している今は22時前なのですが、眠くて頭が溶けそうです・・・。が、眠気に負けずに記事をUpしようと思います！ &#160; 前回の振り返り：区名ラベルが重複表示される！ 前回記・・・<a class="readon" href="http://blog.hitsuji.me/replacement-from-word-name-to-its-code/">続きを読む</a>]]></description>
				<content:encoded><![CDATA[<p>こんばんは。この記事執筆している今は22時前なのですが、眠くて頭が溶けそうです・・・。が、眠気に負けずに記事をUpしようと思います！</p>
<p>&nbsp;</p>
<h3>前回の振り返り：区名ラベルが重複表示される！</h3>
<p><a title="地図に区名を表示する" href="http://blog.hitsuji.me/show-words-name-on-yokohama-city-map/">前回記事</a>の地図の続きです。</p>
<p>前回描いた地図の問題点は、複数の区名が表示されてしまうことでした。小さい島などにも全て区名が表示されると見づらいですよね。</p>
<p><a style="color: #919191;" href="http://static.hitsuji.me/map-yokohama03/"><img class="alignnone size-medium_for_2x wp-image-60" src="http://blog.hitsuji.me/app/wp-content/uploads/2014/05/yokohama_map03-443x600.png" alt="yokohama_map03" width="221" height="300" /></a></p>
<p>&nbsp;</p>
<h3>class属性を利用して表示/非表示をコントロールする</h3>
<p>重複ラベル表示を避ける方法は色々なやり方があるかと思いますが、ここでは</p>
<ul>
<li>区名を英数字のcity-codeに置き換える</li>
<li>各label要素のclass名にcity-codeを指定する</li>
<li>class名を使い、各classにつき１つのlabel要素のみ表示する</li>
</ul>
<p>という方法で行うことにします。class名に指定するには日本語だとHTMLの仕様上NGなので、各区に対応した英数字のcodeを割り振って活用します。</p>
<p>&nbsp;</p>
<h3>区名をcity-codeに置き換える</h3>
<p>TopoJSONファイルの区名を、英数字からなるcodeに置換します。割り振るcodeは連番でもよいのですが、意味がある数字を探してきました。</p>
<p>総務省<br />
<span style="color: #1c1c1c;">全国地方公共団体コード</span> <a title="総務省 全国地方公共団体コード" href="http://www.soumu.go.jp/denshijiti/code.html" target="_blank">http://www.soumu.go.jp/denshijiti/code.html</a></p>
<p>この団体コードに&#8221;id&#8221;というprefixを付けてcity-codeを作成しました。</p>
<h6>replace_words.csv</h6>
<script src="https://gist.github.com/c6be5b8daf0b564c0f10.js"></script><noscript><pre><code class="language-csv csv">港南区,id141119
鶴見区,id141011
神奈川区,id141020
西区,id141038
中区,id141046
南区,id141054
保土ケ谷区,id141062
磯子区,id141071
金沢区,id141089
港北区,id141097
戸塚区,id141101
旭区,id141127
緑区,id141135
瀬谷区,id141143
栄区,id141151
泉区,id141160
青葉区,id141178
都筑区,id141186</code></pre></noscript>
<p>置換programの都合上、エンコードはUTF-8です。</p>
<p><em><span style="color: #808080;">※補足</span></em><br />
<em><span style="color: #808080;">本当は置換ミスを防ぐために、被置換Wordが長い順に並べ替えた方がいいです。実際、私は南区・港南区の置換を一度ミスりました（＾＾；</span></em></p>
<p>&nbsp;</p>
<p>次に置換プログラムを実行します。</p>
<h6>replace_text.py (2.7x系)</h6>
<script src="https://gist.github.com/244a70eaee8b788fe41f.js"></script><noscript><pre><code class="language-python python">#coding:utf-8
'''
Created on 2014/03/27

@author: hitsuji
'''
import csv

# 置換リストをCSVファイルで読み込む
words_filename = 'replace_words'
document_in = 'yokohama_topo.json'
document_out = 'yokohama_topo_out.json'
words = []

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
    # csv.py doesn't do Unicode; encode temporarily as UTF-8:
    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),dialect=dialect, **kwargs)
    for row in csv_reader:
        # decode UTF-8 back to Unicode, cell by cell:
        yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')

with open(words_filename + '.csv', 'rU') as csvfile:
    spamreader = unicode_csv_reader(csvfile, dialect=csv.excel)
    for row in spamreader:
        words.append(row)

text = u&quot;&quot;
with open(document_in, 'rU') as docfile:
    tmpdoc = docfile.read()
    docfile.close()
    text = tmpdoc.encode('utf-8')

for pair in words:
    text = text.replace(pair[0], pair[1])

with open(document_out, 'w') as f:
    f.write(text)
    f.close() </code></pre></noscript>
<p>前々回作成したTopoJSONファイルについて、区名=&gt;コードに置換します。</p>
<p>&nbsp;</p>
<p>長くなったので、今回はここで一旦切ります。</p>
<p>次回は、置換後のTopoJSONファイルを使って重複ラベル表示の問題を解決したいと思います。</p>
<p>それでは、また〜☆</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hitsuji.me/replacement-from-word-name-to-its-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
