Pythonでパスからファイル名を取り出す方法

Python, dev No Comments »

Pythonでパスからファイル名を取り出す方法メモ。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import os
 
filepath = '/path/to/file.name'
filename = os.path.basename(filepath) # file.name

このサイトを参考にした。
ファイルをアップロードするための Python CGI スクリプト

genshiでCDATA書いたら消えた

Python No Comments »

テンプレートファイルにCDATA書いたのに吐き出されたHTMLファイルでは消えてた。
index.tmpl

 
    <script type="text/javascript">
    < ![CDATA[
      swfobject.registerObject("swfobj", "9.0.0", "menu.swf");
    ]]>
    </script>
 


index.html

 
    <script type="text/javascript">
 
      swfobject.registerObject("swfobj", "9.0.0", "menu.swf");
 
    </script>
 

追記(2008/10/17 14:04)--
render("html")と書いてたのを
render("xhtml")にしたら消えなかった。
に変換されてたのも解消された。

Djangoのテンプレートでつまづき中

Python No Comments »

Djangoのテンプレートでfor文中で3回に1度だけ文字列を出力したい。

 
{% for item in items %}
  {{ item.name }},
  {# 3つ出力して改行入れたい #}
{% endfor %}
 
 
{% for item in items %}
  {{ item.name }},
  {% ifequal forloop.counter%3 0 %}{% endifequal %}
{% endfor %}
 

こんなんじゃダメなのかな。動いてない気がする。@GAE。
↑preタグ内の<br />が消えてる。。

Pythonことはじめ #8

Python No Comments »

Instant Hacking
練習2の"ユークリッドの互除法によって2個の数の最大公約数を求める関数を書きなさい。"をやってみた。

#!C:\\Python25\\python.exe
 
def hcd(a,b):
    if(a&lt;b):
        a, b = b, a
 
    while b != 0:
        a, b = b, a % b
 
    return a
 
print hcd(20,12)

解答例はこう↓だった。"aはbより大きいものとする。"そうか。ifあたり不要だった。whileの条件には"!=0"とか要らなかったか。0はFALSEってことなんだっけ。

def euclid(a,b):
    while b:
        a,b = b,a % b
    return a

Jython

Python No Comments »

Jython は Python、Java の初心者が触れてもいいものだろうか。
まったく理解できる気がしないな。出直す。ひとまずPythonの勉強をする。
Jythonプログラミングとか買うとしたら数年後。

Pythonことはじめ #7

Python No Comments »

DBをアップデートする。

入力画面text.htmlのソース:

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"&gt;
  &lt;head&gt;
    &lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8" /&gt;
    &lt;title/&gt;Form&lt;/title&gt;
  &lt;/head/&gt;
  &lt;body/&gt;
    &lt;form action="./form.py" method="post"&gt;
      &lt;p&gt;
        &lt;input type="text" value="" name="text" /&gt;
        &lt;input type="submit" value="submit" /&gt;
      &lt;/p&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;

submitした後の画面form.pyのソース:

#!C:\\Python25\\python.exe
# -*- coding: utf-8 -*-
 
import cgi
import MySQLdb
 
form_data = cgi.FieldStorage()
text = form_data.getfirst("text")
 
con = MySQLdb.connect(db="test", host="localhost", port=3306, user="testuser", passwd="********")
cur = con.cursor()
cur.execute('update pytest set body="%s" where title="%s"' % (text,"test"))
cur.close()
con.close()
 
html_head = '''&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8" /&gt;
&lt;title&gt;Pythonことはじめ&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;'''
 
html_foot = '''&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;'''
 
print "Content-Type: text/html\\n\\n"
print html_head
print text
print "と書き込みました"
print html_foot

dddと書いてsubmitしたら、dddと書き込みましたと表示された。
pytestのtitleがtestのレコードはbodyがdddに変更された。OK。

Pythonことはじめ #6

Python No Comments »

DBに格納されたデータを参照してみる。

testというDBにpytestというテーブルを作成して、
|title|body|
|test|aaa|
というデータを格納。

index.py:

#!C:\\Python25\\python.exe
# -*- coding: utf-8 -*-
 
import MySQLdb
con = MySQLdb.connect(db="test", host="localhost", port=3306, user="testuser", passwd="********")
cur = con.cursor()
 
s = "SELECT title, body FROM pytest"
cur.execute(s)
r = cur.fetchone()
 
print "Content-type:text/html\n\n"
print "&lt;!DOCTYPE html PUBLIC \\"-//W3C//DTD XHTML 1.0 Strict//EN\\" \\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\\"&gt;"
print "&lt;html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\" lang=\"ja\"&gt;"
print "&lt;head&gt;"
print "&lt;meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" /&gt;"
print "&lt;title&gt;Pythonことはじめ&lt;/title&gt;"
print "&lt;/head&gt;"
print "&lt;body&gt;"
print "&lt;p&gt;"
 
while r != None:
  print "%-10s | %-40s" % r
  r = cur.fetchone()
 
print "&lt;/p&gt;"
print "&lt;/body&gt;"
print "&lt;/html&gt;"
 
cur.close()
con.close()

ブラウザから確認すると、test|aaa と表示された。○。

Pythonことはじめ #5

Python No Comments »

ファイルを読み込んで表示。

Python でファイルを読む
を参考に。

f = open('text.txt', 'r')

for line in f:
    print line,

f.close()

サンプルコードそのまま。

text.txt:

watashi wa dododo

watashi wa dododo
と表示された。OK。

続いて、タブ区切りのファイルを。

text.txt:

watashi	wa	dododo
anata	wa	gogogo
for line in open('text.txt', 'r'):
    name, zip, address = line[:-1].split('\t')
    print name
    print "<br />"
    print zip
    print "<br />"
    print address
    print "<br />"
    print "<br />"

全然、名前/郵便番号/住所 じゃありませんが。。

watashi
wa
dododo

anata
wa
gogogo

と表示されたOK。
line[:-1] は、lineの最後に入っている改行コード '\n' を取り除きます。
とのこと。Perlのchompと同等かな。

Pythonことはじめ #4

Python No Comments »

なにかテンプレートエンジンをいじってみたくなったので探してみたらGenshiってのがちょっと気になったので触ってみる。

参考:

ブラウザで

http://ftp.edgewall.com/pub/genshi/Genshi-0.4.2.tar.gz

にアクセスしてDL。
解凍。
Genshi-0.4.2というフォルダができる。
その中のgenshiフォルダをgenshi-test.pyと同じ階層に置く。

genshi-test.py:

#!C:\\Python25\\python.exe
# -*- coding: utf8 -*-

def main():
    print "Content-Type:text/html\\n\\n",
    import cgi
    from genshi.template import TemplateLoader
    from genshi.template import MarkupTemplate
    import os
    TEMPLATE_DIR = "./"
    loader = TemplateLoader(TEMPLATE_DIR)
    tmpl = loader.load('genshi-tmpl.html')
    myList = [u'焼肉',u'寿司',u'手羽先']
    stream = tmpl.generate(myH1 = u"好きな食べ物", myList = myList)
    html = stream.render("html")
    print html
if __name__=='__main__':
    main()

genshi-test.pyと同じ階層にテンプレートファイルgenshi-tmpl.htmlを置く。
genshi-tmpl.html:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://genshi.edgewall.org/" lang="ja">
  <head>
    <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=UTF-8" />
    <title>genshi</title>
  </head>
  <body>
    <h1 py:content="myH1">hogefuga</h1>
    <ol>
      <li py:for="item in myList">${item}</li>
    </ol>
  </body>
</html>

ブラウザからgenshi-test.pyにアクセスすると

好きな食べ物

1. 焼肉
2. 寿司
3. 手羽先

と表示。おk。

Pythonことはじめ #3

Python No Comments »

関数を書いてみる

#!C:\\Python25\\python.exe
# -*- coding: utf-8 -*-

def Say(x):
    return x * 2

print "Content-type:text/html\\n\\n"
print "<!DOCTYPE html PUBLIC \\"-//W3C//DTD XHTML 1.0 Strict//EN\\" \\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\\">"
print "<html xmlns=\\"http://www.w3.org/1999/xhtml\\" xml:lang=\\"ja\\" lang=\\"ja\\">"
print "<head>"
print "<meta http-equiv=\\"Content-Type\\" content=\\"text/html;charset=utf-8\\" />"
print "<title>Pythonことはじめ</title>"
print "</head>"
print "<body>"
print "<p>"

print Say("ho!")
print Say("こんにちは")

print "</p>"
print "</body>"
print "</html>"

ho!ho! こんにちはこんにちは
と表示された。おk。

繰り返しの回数を指定できるようにする

パラメータを2つ渡すように変更。

def Say(x,y):
    return x * y

として

print Say("ho!",2)
print Say("こんにちは",3)

ho!ho! こんにちはこんにちはこんにちは
と表示された。

2つ目のパラメータとして文字列を渡してみる

こんにちは * fugaa とか、数字じゃないものを掛けるとどうなるかな。

print Say("ho!",2)
print Say("こんにちは","fuga")

としてみたら

ho!ho!
だけが表示された。

関数を使って変数をいじってみる

def Say(x,y):
    return x * y

def Say(x,y):
    word = x * y
    return word

と変えてみた。表示されるものに特に変化なし。

word = ""

def Say(x,y):
    word = x * y

として

Say("hello",2)
print word

でhellohelloと表示されるのを期待したけど

None
と表示される

word = ""

def Say(x,y):
    global word
    word = x * y

とすることでhellohelloが表示されるようになった。
グローバル変数ってやつですね。グローバル変数はあんまり使わない方がいいよ、ですかね。

Powered by WordPress | WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in