SQLの窓

2018年04月30日


Python ドキュメントに沿った、テキストファイル読み込みの理解

ソースコードの文字コード

このサンプルでは、ソースコードは SHIFT_JIS を使用しています。( デフォルトでは、Python のソースコードは UTF-8 でエンコードされているものとして扱われます )

※ Python 内で使用される エンコーディングのリスト

# -*- coding: cp932 -*-

try:
	handle = open(r"C:\Users\sworc\Downloads\社員マスタ.csv", "r", encoding="cp932")
except Exception as err:
	print(err)
	quit()

for method in dir(handle):
	if method == "__iter__":
		print(str(type(handle)) + " は for で使える")
		break
else:
	print(str(type(handle)) + " は for で使えない")

for line in handle:
	print(line,end="")


handle.close()

リテラル

ファイルのパスとして使用しているリテラルに、文字 'r' または 'R' をプレフィックスに持つことができます。そのような文字列は raw strings と呼ばれ、バックスラッシュをリテラル文字として扱いますfor 文

for 文は、反復可能なオブジェクト (iterable object) 内の要素に使用できます。

ここでは、組み込み関数の open 関数で取得した ファイルオブジェクト に対して for を実行します。その前に dir 関数 で取得したメソッド一覧の中に __iter__ がある事を確認しています。オブジェクトの中に __iter__ があれば、反復可能な処理が実装されています。

※ break 文が実行されると、 else 節の処理を実行することなくループを終了します

open で取得された ファイルオブジェクト

open() 関数が返す file object の型はモードに依存します。 open() をファイルをテキストモード ('w', 'r', 'wt', 'rt', など) で開くのに使ったときは io.TextIOBase (特に io.TextIOWrapper) のサブクラスを返します。

io.TextIOWrapper > io.TextIOBase > io.IOBase

※ close メソッドは io.IOBase にあります。

その他

str 関数は、オブジェクトを文字列として返します




posted by lightbox at 2018-04-30 20:17 | Python | このブログの読者になる | 更新情報をチェックする

2018年04月24日


Windows10 : Ruby で日本語メール送信

Ruby で正しい情報を収集するのは、他の言語に比べて骨が折れるようです。

今回かなり ISO-2022-JP の MIME 文字列で困りました。まず、NKF.nkf("-WjM", subject) で欲しい文字列は手に入るのですが、渡して実行すると UTF-8 に変換されていました。

また、本文の JIS 作成が良く解らずに調べている途中で、mail-iso-2022-jp の存在を知って余計な時間を使う事をなんとか逃れました。

ソース最後のコメントは、mail ライブラリの smtp.rb の中にあったものですが、シンボルと文字列の違いが最初解らずに納得が行かない時間がちょっとありました。

gem で mail ライブラリ をインストール


ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32]

C:\Users\sworc>gem install mail
Fetching: mini_mime-1.0.0.gem (100%)
Successfully installed mini_mime-1.0.0
Fetching: mail-2.7.0.gem (100%)
Successfully installed mail-2.7.0
Parsing documentation for mini_mime-1.0.0
Installing ri documentation for mini_mime-1.0.0
Parsing documentation for mail-2.7.0
Installing ri documentation for mail-2.7.0
Done installing documentation for mini_mime, mail after 28 seconds
2 gems installed

C:\Users\sworc>gem install mail-iso-2022-jp
Successfully installed mail-iso-2022-jp-2.0.8
Parsing documentation for mail-iso-2022-jp-2.0.8
Done installing documentation for mail-iso-2022-jp after 0 seconds
1 gem installed
require 'nkf'
require 'pp'
require 'mail'
require 'mail-iso-2022-jp'

# ******************
# メール用変数
# ******************
user = "ユーザ名"
pass = "パスワード"
to = "宛先メールアドレス"

# ******************
# メール内容
# ******************
subject = "日本語の件名"
body = "日本語の\n本文\nです"

mail = Mail.new(charset: "ISO-2022-JP")
mail["from"]  = "わたし <#{user}@#{user}.sakura.ne.jp>"
mail["to"] = "あなた <#{to}>"
mail["subject"] = subject
mail["body"] = body

smtp_server = {
	:address => "#{user}.sakura.ne.jp",
	:port  => 587,
	:domain  => "sakura.ne.jp",
	:user_name => "#{user}@#{user}.sakura.ne.jp" ,
	:password  => pass,
	:authentication  => "plain",
	:enable_starttls_auto  => true
}

# ******************
#Pretty Print
# ******************
pp smtp_server

# ******************
# 個別
# ******************
p smtp_server[:address]
p smtp_server[:port]
p smtp_server[:domain]
p smtp_server[:user_name]
p smtp_server[:password]
p smtp_server[:authentication]
p smtp_server[:enable_starttls_auto]

mail.delivery_method(:smtp, smtp_server )

# ******************
#メール送信
# ******************
begin
	mail.deliver
rescue => e
	p e.message
end


# ******************
# Subject の文字列変換のテスト
# ******************
p NKF.nkf("-WjM", subject)

# ******************
#シンボルと文字列の比較
# ******************
if :login.to_s == "login" then
	p "一致"
end
if "login".to_sym == :login then
	p "一致"
end


# === Sending via GMail
#
#	Mail.defaults do
#	 delivery_method :smtp, { :address			  => "smtp.gmail.com",
#							  :port				 => 587,
#							  :domain				=> 'your.host.name',
#							  :user_name			=> '<username>',
#							  :password			 => '<password>',
#							  :authentication		=> 'plain',
#							  :enable_starttls_auto => true  }
#	end

#DEFAULTS = {
#  :address			  => 'localhost',
#  :port				 => 25,
#  :domain				=> 'localhost.localdomain',
#  :user_name			=> nil,
#  :password			 => nil,
#  :authentication		=> nil,
#  :enable_starttls	  => nil,
#  :enable_starttls_auto => true,
#  :openssl_verify_mode  => nil,
#  :ssl				  => nil,
#  :tls				  => nil,
#  :open_timeout		 => nil,
#  :read_timeout		 => nil
#}


関連する記事

Pleiades Eclipse 4.7 Oxygen で Ruby を使って MySQL にアクセスする

エディタのタブの設定









posted by lightbox at 2018-04-24 20:33 | Pleiades | このブログの読者になる | 更新情報をチェックする

2018年04月22日


Python3 でメール送信 ( さくらインターネット )

さくらインターネットのユーザ文字列が埋め込みサンプルとして適しているので使用しました。

デフォルトでは、utf-8 で Subject がエンコードされるので email.charset.Charset クラスのメソッドで iso-2022-jp に変換しています。
Subject: =?utf-8?b?UHl0aG9uIOOBi+OCiSBVVEYtOCDjga7mloflrZfliJc=?=
文字列の埋め込みは f-string です。
# *************************
# 型と内容の確認
# *************************
def typrint(obj):
	print(type(obj))
	print(obj)
	print("")

# *************************
# ライブラリ
# *************************
import smtplib
from email.mime.text import MIMEText
import datetime
from  email.charset import Charset

# *************************
# 日付のテスト
# *************************
# 日付だけ欲しい場合はこちら
today = datetime.date.today()
typrint(today)

# datetime オブジェクトは date オブジェクトおよび time オブジェクトの全ての情報が入っている単一のオブジェクトです。
today = datetime.datetime.today()
typrint(today)

# 書式 : https://docs.python.jp/3/library/datetime.html#strftime-strptime-behavior
strdate = today.strftime("%Y-%m-%d %H:%M:%S")
typrint(strdate)

# *************************
# メール用キャラクタセット
# *************************
jis='iso-2022-jp'

# *************************
# 本文
# *************************
text = "Python\n日本語\nUTF-8\n"
text += "Python文字列操作マスター\nhttps://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887"
text += "https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887"
text = text.encode(jis)		# iso-2022-jp でテキスト全体をエンコード
typrint(text)
msg = MIMEText(text, 'plain', jis)		# メール送信用データのベースを作成

# *************************
# 送信用情報
# *************************
user = "ユーザ"		# さくらインターネットのユーザ
password = "パスワード"
port = 587
to = "宛先メールアドレス"

# *************************
# メールヘッダ
# *************************
charset = Charset(jis)		# Subject 用エンコードに使用( これをしないと utf-8 が使用される )
msg["Subject"] = charset.header_encode("Python から UTF-8 の文字列 : " + strdate )
msg["From"] = f"{user}@{user}.sakura.ne.jp"
msg["To"] = to

# *************************
# 確認用出力
# *************************
print(msg)

# *************************
# メール送信
# *************************
try:

	smtp_server = smtplib.SMTP(f"{user}.sakura.ne.jp",port)
	smtp_server.starttls()
	smtp_server.login(f"{user}@{user}.sakura.ne.jp", password)
	smtp_server.send_message( msg )
	smtp_server.quit()

	print("メールを送信しました")

except Exception as err:

	print(err)
	print("メール送信に失敗しました" )




▼ 出力結果
<class 'datetime.date'>
2018-04-22

<class 'datetime.datetime'>
2018-04-22 20:30:27.176934

<class 'str'>
2018-04-22 20:30:27

<class 'bytes'>
b'Python\n\x1b$BF|K\\8l\x1b(B\nUTF-8\nPython\x1b$BJ8;zNsA`:n%^%9%?!<\x1b(B\nhttps://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887'

Content-Type: text/plain; charset="iso-2022-jp"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: =?iso-2022-jp?b?UHl0aG9uIBskQiQrJGkbKEIgVVRGLTggGyRCJE5KODt6TnMbKEIgOiAyMDE4LTA0LTIyIDIwOjMwOjI3?=
From: ユーザ@ユーザ.sakura.ne.jp
To: 宛先メールアドレス

Python
$BF|K\8l(B
UTF-8
Python$BJ8;zNsA`:n%^%9%?!<(B
https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887
メールを送信しました



posted by lightbox at 2018-04-22 20:40 | Python | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり