<?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>さくらたんどっとびーず &#187; Python</title>
	<atom:link href="http://sakuratan.biz/archives/tag/python/feed" rel="self" type="application/rss+xml" />
	<link>http://sakuratan.biz</link>
	<description>モロモロ工事中です</description>
	<lastBuildDate>Sun, 25 Jun 2023 12:51:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Pythonのターミナルに出力する際に文字コード関係のエラーを抑制する</title>
		<link>http://sakuratan.biz/archives/5140</link>
		<comments>http://sakuratan.biz/archives/5140#comments</comments>
		<pubDate>Mon, 14 Nov 2011 10:06:55 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[UnicodeEncodeError]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=5140</guid>
		<description><![CDATA[Python 使ってると、日本語を表示する際に処理系が勝手に文字コードを変換しようとしてエラーが出て困ったりします。 こんな感じ↓のやつです。 &#62;&#62;&#62; print u'\uffff' Traceback &#40;most recent call last&#41;: &#160; File &#34;&#60;stdin&#62;&#34;, line 1, in &#60;mo... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/5140">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>Python 使ってると、日本語を表示する際に処理系が勝手に文字コードを変換しようとしてエラーが出て困ったりします。<br />
こんな感じ↓のやつです。</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> u<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\u</span>ffff'</span><br />
Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:<br />
&nbsp; File <span style="color: #483d8b;">&quot;&lt;stdin&gt;&quot;</span><span style="color: #66cc66;">,</span> line <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #66cc66;">&lt;</span>module<span style="color: #66cc66;">&gt;</span><br />
<span style="color: #008000;">UnicodeEncodeError</span>: <span style="color: #483d8b;">'euc_jp'</span> codec can<span style="color: #483d8b;">'t encode character u'</span>\uffff<span style="color: #483d8b;">' in position 0:<br />
illegal multibyte sequence</span></div></div>
<hr class="linebreak">
<p>普段は放置してるのですがちょっと真剣に対応してみることにしました。<br />
（この手の情報欲しい人はある程度 Python 詳しい人だと思いますし）グダグダ説明するような話でも無いので細かい説明は抜きで解決方法だけ書こうと思います。</p>
<ol>
<li>以下のファイルを safe_terminal.py に保存。
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">codecs</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> find_encoding<span style="color: black;">&#40;</span>fh<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> fh.<span style="color: black;">encoding</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> fh.<span style="color: black;">encoding</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'utf-8'</span><br />
<br />
<span style="color: #808080; font-style: italic;">#error = 'ignore'</span><br />
error <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'backslashreplace'</span><br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">codecs</span>.<span style="color: black;">getwriter</span><span style="color: black;">&#40;</span>find_encoding<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span><span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span><br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span> <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">codecs</span>.<span style="color: black;">getwriter</span><span style="color: black;">&#40;</span>find_encoding<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span><span style="color: #66cc66;">,</span> error<span style="color: black;">&#41;</span></div></div>
</li>
<li>print 等を使うプログラムで safe_terminal.py を import する。
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> safe_terminal<br />
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> u<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\u</span>ffff'</span><br />
\uffff</div></div>
</li>
</ol>
<p>こんな感じで stdout / stderr に対する print や write 時に変換できない文字をバックスラッシュでエスケープするのが便利かと思います。Python に含まれるライブラリ自体を書き換える方法もありますが、サーバ何台も扱ってると面倒なのでパスって感じです。</p>
<p>変換できない文字を非表示にしたい場合は error = &#8216;ignore&#8217; に変えてください。</p>
<h3>参考にしたページ</h3>
<p><a href="http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html">PythonのUnicodeEncodeErrorを知る &#8211; HDEラボ</a><br />
<a href="http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/encoding.html">Python でUTF-8, shift_jis, euc_jpなど日本語を使う方法</a></p>
<p>あじゃじゃしたーw</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/5140/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Unixのターミナルからビープ音を鳴らす方法</title>
		<link>http://sakuratan.biz/archives/4013</link>
		<comments>http://sakuratan.biz/archives/4013#comments</comments>
		<pubDate>Thu, 14 Apr 2011 06:29:09 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[開発環境]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[ターミナル]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=4013</guid>
		<description><![CDATA[先日30分ぐらいかかるスクリプトを実行していたのですが、終わったらビープ音で通知してくれると便利かなーと思って調べてみました。 ビープ音の文字コードは 0&#215;7 まず基本的なこととして、ASCII コードの 0&#215;7 は BEL となっており、（デバイス的に）適当なベル音を鳴らす文字コードとなっています。 つまり 0&#215;7 を出力したらビープ音が鳴るってことです。 シェルか... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/4013">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>先日30分ぐらいかかるスクリプトを実行していたのですが、終わったらビープ音で通知してくれると便利かなーと思って調べてみました。</p>
<h3>ビープ音の文字コードは 0&#215;7</h3>
<p>まず基本的なこととして、ASCII コードの 0&#215;7 は BEL となっており、（デバイス的に）適当なベル音を鳴らす文字コードとなっています。</p>
<p>つまり 0&#215;7 を出力したらビープ音が鳴るってことです。</p>
<h3>シェルから鳴らす</h3>
<p>シェルから鳴らす場合、echo コマンドを使います。コマンドラインから 0&#215;7 を指定するにはコントロールシーケンス ^G を入力します。</p>
<p>一般的なターミナルでは [CTRL]+v [CTRL]+g を連続して入力するとコントロールシーケンス ^G が入力できます。文字列 &#8220;^G&#8221; を入力しても鳴りませんので注意してください。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span><span style="color: #7a0874; font-weight: bold;">echo</span> ^G</div></div>
<p>printf コマンドがインストールされている環境では、以下のようにビープ音を鳴らすこともできます。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">'\007'</span></div></div>
<h3>プログラミング言語から鳴らす</h3>
<p>0&#215;07 が出力できれば良いので、基本的にどのプログラミング言語からでもビープ音を鳴らすことができます。</p>
<p>代表的な LL 言語で鳴らす方法は以下のようになります。</p>
<div class="codecolorer-container perl dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># perl</span><br />
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>07&quot;</span><span style="color: #339933;">;</span></div></div>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># python</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>07&quot;</span></div></div>
<div class="codecolorer-container ruby dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># ruby</span><br />
<span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;<span style="color:#000099;">\0</span>07&quot;</span></div></div>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\007</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></div>
<p>全部いっしょとか言わないのw</p>
<p>んでわ。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/4013/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>さくらインターネットスタンダードプランで UTF-8 の MeCab を使う際のメモ</title>
		<link>http://sakuratan.biz/archives/1349</link>
		<comments>http://sakuratan.biz/archives/1349#comments</comments>
		<pubDate>Sun, 25 Oct 2009 10:31:49 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[ウェブアプリ]]></category>
		<category><![CDATA[MeCab]]></category>
		<category><![CDATA[さくらインターネット]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=1349</guid>
		<description><![CDATA[最近ちーと忙しいもので、ブログの間隔空ちゃってます。サーセン＞＜ あんまりあいだ空けるのもアレなので、今日はさくらインターネットのスタンダード鯖で、MeCab を UTF-8 で使う方法を簡単にご紹介。 まず MeCab は形態素解析のライブラリです。本家サイトはこちら。 MeCab: Yet Another Part-of-Speech and Morphological Analyzer さく... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/1349">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>最近ちーと忙しいもので、ブログの間隔空ちゃってます。サーセン＞＜</p>
<p>あんまりあいだ空けるのもアレなので、今日はさくらインターネットのスタンダード鯖で、MeCab を UTF-8 で使う方法を簡単にご紹介。</p>
<p>まず MeCab は形態素解析のライブラリです。本家サイトはこちら。</p>
<blockquote><p>
<a href="http://mecab.sourceforge.net/">MeCab: Yet Another Part-of-Speech and Morphological Analyzer</a>
</p></blockquote>
<p>さくらインターネットのサーバには元から MeCab がインストールされてますので、単に使うだけならそのままでおkです。ただ EUC-JP 版の辞書がインスコされてますので、そのまま UTF-8 なウェブアプリで使用すると<a href="http://www.atmarkit.co.jp/fjava/rensai3/mojibake02/mojibake02.html">〜問題</a>が発生します。今日ご紹介するのはそれを回避する方法です。</p>
<p>回避方法は簡単で、UTF-8 な辞書ファイルを別にインスコするだけです。以下、具体的なやり方。</p>
<ol>
<li><b>辞書のアーカイブをサーバにアップロード</b><br />
<a href="http://mecab.sourceforge.net/#download">MeCab のダウンロードページ</a> から、IPA 辞書の最新版をダウンロードして、サーバにうpします。</li>
<li><b>アーカイブを展開してインスコ</b><br />
以下のコマンドをおもむろに打ち込み、UTF-8 の辞書を $HOME/lib/mecab/dic/ipadic-utf8 にインスコします。インスコ先のパスは適当に変えてください。</p>
<pre>% tar xvzf mecab-ipadic-2.7.0-20070610.tar.gz
% cd mecab-ipadic-2.7.0-20070610
% ./configure --with-charset=utf8 --with-dicdir=$HOME/lib/mecab/dic/ipadic-utf8
% make
% make install</pre>
</li>
<li><b>MeCab を動かす</b><br />
コマンドラインから MeCab を動かす際は、-d オプションで辞書のディレクトリを指定します。</p>
<pre>% mecab -d ~/lib/mecab/dic/ipadic-utf8 utf8.txt
あ      フィラー,*,*,*,*,*,あ,ア,ア
ああ    感動詞,*,*,*,*,*,ああ,アア,アー
EOS</pre>
<p>プログラムから使用する場合も基本的には同じです。以下は Python バインディングでの使用例。</p>
<pre>import os
import MeCab
dicdir = os.path.expanduser('~/lib/mecab/dic/ipadic-utf8')
m = MeCab.Tagger ("-Ochasen -d%s" % dicdir)
print m.parse ("今日もしないとね")</pre>
</li>
</ol>
<p><img src="http://sakuratan.biz/blog/wp-content/plugins/sakura-icons/icon2.png" width="160" height="160" border="0" style="border:0;float:left" /><br />
ということで本日はこの辺にて。<br />
ではでは☆<br clear="left" /></p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/1349/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
