Python」カテゴリーアーカイブ

プログラミング言語「Python」に関するカテゴリーです。

PythonでUnicodeEncodeErrorとなる場合に

Pythonで端末のエンコーディング取得はgetpreferredencodingでできます。

>>> import sys
>>> locale.getpreferredencoding()
'cp932'

「あいうえお」と表示するスクリプト(sample.py)

# -*- coding: UTF-8 -*-
s = u'あいうえお'
print s

コマンドプロンプトから

> python.exe sample.py
あいうえお

出力をファイルにリダイレクト

> python.exe sample.py > sample.txt
Traceback (most recent call last):
  File "a.py", line 3, in <module>
    print s
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

エンコーディングを取得するように修正

# -*- coding: UTF-8 -*-
import locale
encoding = locale.getpreferredencoding()
s = u'あいうえお'
print s.encode(encoding)

問題なく表示できます。

> python.exe sample.py
あいうえお

PythonでCSVファイルの読み書き

PythonでCSV(comma-separated values)を取り扱う場合、

aaa,120,240
bbb,320,240

のようなデータであればsplitを使って簡単に

>>> for row in open('data.csv').readlines():
...   row = row.strip().split(',')
...   print row
...
['aaa', '120', '240']
['bbb', '320', '240']

とできますが、'aa,aa'のようなデータが含まれていたりすると面倒なことになってしまいます。

そういう場合は出来合いのライブラリを使うのが便利です。

aaa,120,240
b bb,320,240
"cc,c",240,120

という少し複雑なデータに対しても

>>> import csv
>>> for row in csv.reader(open('data.csv', 'rb')):
...   print row
...
['aaa', '120', '240']
['b bb', '320', '240']
['cc,c', '240', '120']

と、扱うことができます。

ちなみに、区切り文字カンマはdelimiter、ダブルクォートはquotecharで変更できます。

>>> csv.reader(open('data.csv', 'rb'), delimiter=' ', quotechar="'")

Pythonで名前解決

ホスト名からIPv4アドレスを取得

>>> import socket
>>> socket.gethostbyname('www.python.org')
'82.94.164.162'

IPアドレスからホスト名を取得

>>> socket.gethostbyaddr('82.94.164.162')
('dinsdale.python.org', [], ['82.94.164.162'])

ホスト名からIPv6アドレスを取得したい場合はgetaddrinfoを使うみたいです。