Skynet

---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks

#


 参考 : http://mifunny.info/python-image-watermark-script-68.html

 下载 :http://code.google.com/p/nothing-at-all/downloads/detail?name=watermark_py_20080724.tar.bz2&can=2&q=

  直接解压:
  easy_install PIL
  >>python "watermark.py" "C:"Documents and Settings"lky"桌面"py"fangfei.jpg" 2

   Save to  C:"Documents and Settings"lky"桌面"py"fangfei_watermark.jpg



 

posted @ 2009-10-27 23:49 刘凯毅 阅读(1027) | 评论 (0)编辑 收藏


telnet 192.168.101.103 8014
import threading  

class myThread(threading.Thread):
    
def __init__(self,conn,add):
        threading.Thread.
__init__(self)
        self.inputstr 
= ''
    self.connection
=conn
    self.address
=add
    
def run(self):
    ii
=0
        
while True:
        self.connection.settimeout(
50)
            buf 
= self.connection.recv(1024)
        
if  buf.rfind("\n"> -1 :  
                
print "**-"+self.inputstr
                self.connection.close() 
                
break
            
else:  
                self.inputstr
+=buf
        
if ii==0:
            self.connection.send(buf)
        ii
+=1
                
continue

            
            


if __name__ == '__main__':  
   
import socket  
   sock 
= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   sock.bind((
'192.168.101.103'8014))  
   sock.listen(
5)
   
while True:  
       
try:
           connection,address 
= sock.accept()
           ithread
=myThread(connection,address)
           ithread.start()
       
except socket.timeout:  
           
print 'time out'  



posted @ 2009-10-27 19:16 刘凯毅 阅读(1839) | 评论 (0)编辑 收藏


在服务器上发现的定时的导入脚本,记录下来。还是很有用的
30 06 * * * /data/dmsp/shell/crontab_search_stats_import.sh >> /data/dmsp/logs/crontab_search_stats_import.log
#!/bin/sh

y
=$(date -"-1 day" +%Y)
m
=$(date -"-1 day" +%m)
d
=$(date -"-1 day" +%d)

#/data/dmsp/ftp/dim_stats/2009/09/14

act
=dim_stats
mypath
=/data/dmsp/ftp/${act}/${y}/${m}/${d}/

echo $mypath
statpath
=${mypath}${act}${y}${m}${d}.tar.bz2.state

for(( j=1; j<10000; j=j+1))
do
    
if [ -"${statpath}" ] ; then
              tar xjf ${mypath}${act}${y}${m}${d}.tar.bz2 
-C ${mypath}
                mysql 
-127.0.0.1 -P3306 -u root -pmysql -"LOAD DATA INFILE '${mypath}part-00000' INTO TABLE dmsp.dmsp_veidoo character set utf8 FIELDS TERMINATED BY '\t' lines terminated by '\n'";
        
break    
    
else
        echo 
"[${j}:1000] not ready. sleep 10 seconds then retry."
        sleep 
10
    fi
don


posted @ 2009-10-23 10:51 刘凯毅 阅读(2397) | 评论 (1)编辑 收藏


数据挖掘研究内容和本质
  随着DMKD研究逐步走向深入,数据挖掘和知识发现的研究已经形成了三根强大的技术支柱:数据库、人工智能和 数理统计。因此,KDD大会程序委员会曾经由这三个学科的权威人物同时来任主席。目前DMKD的主要研究内容包括基础理论、发现算法、数据仓库、可视化技 术、定性定量互换模型、知识表示方法、发现知识的维护和再利用、半结构化和非结构化数据中的知识发现以及网上数据挖掘等。

数据挖掘所发现的知识最常见的有以下四类:
- 广义知识(Generalization)
  广义知识指类别特征的概括性描述知识。根据数据的微观特性发现其表征的、带有普遍性的、较高层次概念的、中观和宏观的知识,反映同类事物共同性质,是对数据的概括、精炼和抽象。

广 义知识的发现方法和实现技术有很多,如数据立方体、面向属性的归约等。数据立方体还有其他一些别名,如“多维数据库”、“实现视图”、“OLAP"等。该 方法的基本思想是实现某些常用的代价较高的聚集函数的计算,诸如计数、求和、平均、最大值等,并将这些实现视图储存在多维数据库中。既然很多聚集函数需经 常重复计算,那么在多维数据立方体中存放预先计算好的结果将能保证快速响应,并可灵活地提供不同角度和不同抽象层次上的数据视图。另一种广义知识发现方法 是加拿大SimonFraser大学提出的面向属性的归约方法。这种方法以类SQL语言表示数据挖掘查询,收集数据库中的相关数据集,然后在相关数据集上 应用一系列数据推广技术进行数据推广,包括属性删除、概念树提升、属性阈值控制、计数及其他聚集函数传播等。
   
- 关联知识(Association)
  它反映一个事件和其他事件之间依赖或关联的知识。如果两项或多项属性之间存在关联,那么其中一项的属性值就可 以依据其他属性值进行预测。最为著名的关联规则发现方法是R.Agrawal提出的Apriori算法。关联规则的发现可分为两步。第一步是迭代识别所有 的频繁项目集,要求频繁项目集的支持率不低于用户设定的最低值;第二步是从频繁项目集中构造可信度不低于用户设定的最低值的规则。识别或发现所有频繁项目 集是关联规则发现算法的核心,也是计算量最大的部分。
   
- 分类知识(Classification&Clustering)
  它反映同类事物共同性质的特征型知识和不同事物之间的差异型特征知识。最为典型的分类方法是基于决策树的分类 方法。它是从实例集中构造决策树,是一种有指导的学习方法。该方法先根据训练子集(又称为窗口)形成决策树。如果该树不能对所有对象给出正确的分类,那么 选择一些例外加入到窗口中,重复该过程一直到形成正确的决策集。最终结果是一棵树,其叶结点是类名,中间结点是带有分枝的属性,该分枝对应该属性的某一可 能值。最为典型的决策树学习系统是ID3,它采用自顶向下不回溯策略,能保证找到一个简单的树。算法C4.5和C5.0都是ID3的扩展,它们将分类领域 从类别属性扩展到数值型属性。

数据分类还有统计、粗糙集(RoughSet)等方法。线性回归和线性辨别分析是典型的统计模型。为降低决策树生成代价,人们还提出了一种区间分类器。最近也有人研究使用神经网络方法在数据库中进行分类和规则提取。
   
- 预测型知识(Prediction)
  它根据时间序列型数据,由历史的和当前的数据去推测未来的数据,也可以认为是以时间为关键属性的关联知识。

目 前,时间序列预测方法有经典的统计方法、神经网络和机器学习等。1968年Box和Jenkins提出了一套比较完善的时间序列建模理论和分析方法,这些 经典的数学方法通过建立随机模型,如自回归模型、自回归滑动平均模型、求和自回归滑动平均模型和季节调整模型等,进行时间序列的预测。由于大量的时间序列 是非平稳的,其特征参数和数据分布随着时间的推移而发生变化。因此,仅仅通过对某段历史数据的训练,建立单一的神经网络预测模型,还无法完成准确的预测任 务。为此,人们提出了基于统计学和基于精确性的再训练方法,当发现现存预测模型不再适用于当前数据时,对模型重新训练,获得新的权重参数,建立新的模型。 也有许多系统借助并行算法的计算优势进行时间序列预测。
   
- 偏差型知识(Deviation)
  此外,还可以发现其他类型的知识,如偏差型知识(Deviation),它是对差异和极端特例的描述,揭示事 物偏离常规的异常现象,如标准类外的特例,数据聚类外的离群值等。所有这些知识都可以在不同的概念层次上被发现,并随着概念层次的提升,从微观到中观、到 宏观,以满足不同用户不同层次决策的需要。
   

数据挖掘的功能
  数据挖掘通过预测未来趋势及行为,做出前摄的、基于知识的决策。数据挖掘的目标是从数据库中发现隐含的、有意义的知识,主要有以下五类功能。
   
- 自动预测趋势和行为
  数据挖掘自动在大型数据库中寻找预测性信息,以往需要进行大量手工分析的问题如今可以迅速直接由数据本身得出 结论。一个典型的例子是市场预测问题,数据挖掘使用过去有关促销的数据来寻找未来投资中回报最大的用户,其它可预测的问题包括预报破产以及认定对指定事件 最可能作出反应的群体。
   
- 关联分析
  数据关联是数据库中存在的一类重要的可被发现的知识。若两个或多个变量的取值之间存在某种规律性,就称为关 联。关联可分为简单关联、时序关联、因果关联。关联分析的目的是找出数据库中隐藏的关联网。有时并不知道数据库中数据的关联函数,即使知道也是不确定的, 因此关联分析生成的规则带有可信度。
   
- 聚类
  数据库中的记录可被化分为一系列有意义的子集,即聚类。聚类增强了人们对客观现实的认识,是概念描述和偏差分 析的先决条件。聚类技术主要包括传统的模式识别方法和数学分类学。80年代初,Mchalski提出了概念聚类技术牞其要点是,在划分对象时不仅考虑对象 之间的距离,还要求划分出的类具有某种内涵描述,从而避免了传统技术的某些片面性。
   
- 概念描述
  概念描述就是对某类对象的内涵进行描述,并概括这类对象的有关特征。概念描述分为特征性描述和区别性描述,前 者描述某类对象的共同特征,后者描述不同类对象之间的区别。生成一个类的特征性描述只涉及该类对象中所有对象的共性。生成区别性描述的方法很多,如决策树 方法、遗传算法等。
   
- 偏差检测
  数据库中的数据常有一些异常记录,从数据库中检测这些偏差很有意义。偏差包括很多潜在的知识,如分类中的反常实例、不满足规则的特例、观测结果与模型预测值的偏差、量值随时间的变化等。偏差检测的基本方法是,寻找观测结果与参照值之间有意义的差别。
   

数据挖掘常用技术
- 人工神经网络
  仿照生理神经网络结构的非线形预测模型,通过学习进行模式识别。
   
- 决策树
  代表着决策集的树形结构。
   
- 遗传算法
  基于进化理论,并采用遗传结合、遗传变异、以及自然选择等设计方法的优化技术。
   
- 近邻算法
  将数据集合中每一个记录进行分类的方法。
   
- 规则推导
  从统计意义上对数据中的“如果-那么”规则进行寻找和推导。

采用上述技术的某些专门的分析工具已经发展了大约十年的历史,不过这些工具所面对的数据量通常较小。而现在这些技术已经被直接集成到许多大型的工业标准的数据仓库和联机分析系统中去了。
  摘自《数据挖掘讨论组》
posted @ 2009-10-22 18:05 刘凯毅 阅读(1997) | 评论 (1)编辑 收藏


中文参考资料:http://www.biosino.org/R/R-doc/
报表图: http://zoonek2.free.fr/UNIX/48_R/03.htmlhttp://addictedtor.free.fr/graphiques/graphiques/graph_113.png

*



*


posted @ 2009-10-22 16:59 刘凯毅 阅读(333) | 评论 (0)编辑 收藏

1. 安装 python 2.6 (鄙视下-python.org/download被屏蔽)
2. 可爱的Python: 使用setuptools 孵化Python egg
3. easy_install django
4. http://github.com/sneeu/django-wiki  download 
5. django-admin.py startproject newtest
6. cd newtest
7. 拷贝 django-wiki 解压包到 newtest/wiki
8. vim setting.py
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME 
= 'mysite.db'

INSTALLED_APPS = (
    ......
    'newtest.wiki',
)
9. vim urls.py
urlpatterns = patterns('',
    (r'^wiki/'
, include('wiki.urls')),
)
10. cd ..
11. manage.py syncdb
12. manage.py runserver

13. http://127.0.0.1:8000/wiki/

哦~ 不太好,改善改善!
自己的定制自己的wiki 呵呵

posted @ 2009-10-21 00:13 刘凯毅 阅读(1456) | 评论 (0)编辑 收藏


我这 对测试 mysql infobright 压缩 和 查询速度 进行测试
测试结果我会尽快登出的
#!/usr/bin/python
import MySQLdb
#conn = MySQLdb.Connection('127.0.0.1', 'root', '', 'dmspi')
conn=MySQLdb.connect(host="127.0.0.1",port=3307,user="root",passwd="",db="test")
cur 
=  conn.cursor()
st 
= "create table testtime4 ( "

try :
        
for cc in xrange(1000):
                
if cc % 2 == 0 :
                        st 
+= 'a'+str(cc)+' varchar(20),\n'
                
else :
                        st 
+= 'a'+str(cc)+' int(20),\n'

        st 
+= 'a int(20)'
        st 
= st + ");"
        cur.execute(st)

       
# import sys
        # sys.exit(
1)
        
import random
        ccs 
= lambda : random.choice(['apple''pear''peach''orange''lemon',''])
        ccn 
= lambda : random.randint(0,10000)


        fd 
= open('/data/logs/dataFormat/test/t4.data','w')
        
for cc in xrange(10000000):
                st 
= ''
                ss 
= ccs()
                nn 
= str(ccn())
                
for cc in xrange(1000):
                        
if cc < 15 :
                                
if cc % 2 == 0 :
                                        st 
+= ss+'\t'
                                
else :
                                        st 
+= nn+'\t'
                        
else :
                                st 
+= '\t'
                st 
+= nn
                
print >>fd,st
        fd.close()

        # cur.execute(
'load data infile \'/data/logs/dataFormat/test/t4.data\'  into table testtime4 fields terminated by "\t";')
finally :
        cur.close()
        conn.close()


mysql infobright 测试结果报告:



一千万条数据导入花费时间:

mysql
> load data infile '/data/logs/dataFormat/test/t4.data'  into table testtime4 fields terminated by "\t";
Query OK, 
10000000 rows affected (36 min 47.00 sec)


测试一 :
1. 表属性 有 500 列 
2. 属性列都有值, 无 Null 数据
3. 原始文件大小 26G ,导入数据仓库 5G

部分测试时间:
select count(*from testtime where a0="pear" and a2="orange";
1 row in set (3.63 sec)

select a6,count(*from testtime group by a6 order by a6 desc ;
5 rows in set (2.24 sec)

mysql
> select count(*from testtime where a0="apple" ;
1 row in set (5.68 sec)


测试二 :
1. 表属性 有 1000 列 
2. 属性列前 15 列有值 , 其余后面都为 Null
3. 原始文件大小 10G ,导入数据仓库 215M

mysql
> select a0,count(*from testtime4 group by a0 ;
+--------+----------+
| a0     | count(*|
+--------+----------+
| lemon  |  1665543 | 
| peach  |  1666276 | 
| orange |  1667740 | 
| pear   |  1665910 | 
| apple  |  1665678 | 
| NULL   |  1668863 | 
+--------+----------+
6 rows in set (4.55 sec)


select * from testtime4 order by a6 desc limit 2000000,1 ;
1 row in set (3.30 sec)


posted @ 2009-10-20 13:44 刘凯毅 阅读(1584) | 评论 (0)编辑 收藏



参考:http://blog.chinaunix.net/u/29134/showart_485759.html
可以说本文关键就是他


mysql max 版本下载.
或者你这 心情好 编译边
参考 : ./configure  --prefix=/home/lky/tools/mysql2 --with-plugins=heap,innobase,myisam,ndbcluster,federated,blackhole   --enable-assembler --enable-static
然后 在 my.cnf 的
[mysqld]
federated  #加入


 mysql 参考:http://blog.chinaunix.net/u3/90603/showart_1925406.html


mysql> show engines;
+------------+----------+----------------------------------------------------------------+--------------+-----+------------+
| Engine     | Support  | Comment                                                        | Transactions | XA  | Savepoints |
+------------+----------+----------------------------------------------------------------+--------------+-----+------------+
| ndbcluster | DISABLED | Clustered, fault-tolerant, memory-based tables                 | YES          | NO  | NO         |
| FEDERATED  | YES      | Federated MySQL storage engine        | YES          | NO  | NO         |
| MRG_MYISAM | YES      | Collection of identical MyISAM tables                          | NO           | NO  | NO         |
| MyISAM     | DEFAULT  | Default engine as of MySQL 3.23 with great performance         | NO           | NO  | NO         |
| BLACKHOLE  | YES      | /dev/null storage engine (anything you write to it disappears) | NO           | NO  | NO         |
| InnoDB     | YES      | Supports transactions, row-level locking, and foreign keys     | YES          | YES | YES        |
| MEMORY     | YES      | Hash based, stored in memory, useful for temporary tables      | NO           | NO  | NO         |
| ARCHIVE    | YES      | Archive storage engine                                         | NO           | NO  | NO         |
+------------+----------+----------------------------------------------------------------+--------------+-----+------------+


http://topic.csdn.net/u/20071122/11/016C3D25-82A2-46DC-B8B0-3A22F8573C70.html


测试:
0. mysql_install_db 生成 测试 basedir
1. mysqld_safe  服务器开启
2. mysql 测试

先郁闷句 在max 版本上 没有 mysql_install_db !!,自己想办法把 ,下个其他版本的 给 install database !
[client]
socket
=/home/lky/data/d2/mysql.sock
port
=3308

[mysqld]
port
=3308
datadir
=/home/lky/data/d2
socket
=/home/lky/data/d2/mysql.sock

user
=lky
# Default to using old password format for compatibility with mysql 
3.x
# clients (those using the mysqlclient10 compatibility package).
#old_passwords
=123

[mysqld_safe]
log-error
=/home/lky/data/d2/mysqld.log
pid-file
=/home/lky/data/d2/mysqld.pid


命令  
启动 服务1 # 注意 my.cnf 的端口 和  datadir
cd /usr/local/mysql-max-5.1.5-alpha-linux-i686-glibc23
update user set host="%" where user='root' ;
./bin/mysqld_safe --defaults-file=/home/lky/data/d1/my.cnf 

启动 服务2 # 注意 my.cnf 的端口 和  datadir
cd /usr/local/mysql-max-5.1.5-alpha-linux-i686-glibc23
./bin/mysqld_safe --defaults-file=/home/lky/data/d2/my.cnf 

运行1
./bin/mysql --defaults-file=/home/lky/data/d1/my.cnf
>create table t_tableC (id int not null auto_increment primary key, c_str char(20) not null)
>insert into t_tableC values(1,'cc');
运行2
./bin/mysql --defaults-file=/home/lky/data/d2/my.cnf
>create table t_tableC (id int not null auto_increment primary key, c_str char(20) not null)
  engine federated
  connection = 'mysql://lky@127.0.0.1:3307/test/t_tableC';
> select * from t_tableC ;
+----+-------+
| id | c_str |
+----+-------+
|  1 | cc    |
+----+-------+


最让我喜欢的一个特性:
在 d2 上 (运行2)上本地的 表 可以和  federated 进行 表连
mysql> select * from t2 ;
+------+------+
| id   | vn   |
+------+------+
|    1 | cc   |
+------+------+
1 row in set (0.29 sec)

mysql
> show create table t2 ;
+-------+----------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                         |
+-------+----------------------------------------------------------------------------------------------------------------------+
| t2    | CREATE TABLE `t2` (
  `id` 
int(11default NULL,
  `vn` 
char(10default NULL
) ENGINE
=MyISAM DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql
> select * from t_tableC c,t2 t where c.id=c.id ;
+----+--------+------+------+
| id | c_str  | id   | vn   |
+----+--------+------+------+
|  1 | cc     |    1 | cc   |
|  2 | ccttcc |    1 | cc   |
+----+--------+------+------+
2 rows in set (0.00 sec)






 




posted @ 2009-10-08 12:59 刘凯毅 阅读(2035) | 评论 (0)编辑 收藏

参考:
  http://hadoop.apache.org/common/docs/r0.15.2/streaming.html

注意
  目前 streaming 对 linux pipe #也就是 cat |wc -l 这样的管道 不支持,但不妨碍我们使用perl,python 行式命令!!
  原话是 :
  Can I use UNIX pipes? For example, will -mapper "cut -f1 | sed s/foo/bar/g" work?
    Currently this does not work and gives an "java.io.IOException: Broken pipe" error.
    This is probably a bug that needs to be investigated.
  但如果你是强烈的 linux shell pipe 发烧友 ! 参考下面
  $> perl -e 'open( my $fh, "grep -v null tt |sed -n 1,5p |");while ( <$fh> ) {print;} '
     #不过我没测试通过 !!

环境 :hadoop-0.18.3
$> find . -type f -name "*streaming*.jar"
./contrib/streaming/hadoop-0.18.3-streaming.jar


测试数据:
-bash-3.00$ head tt 
null    false    3702    208100
6005100    false    70    13220
6005127    false    24    4640
6005160    false    25    4820
6005161    false    20    3620
6005164    false    14    1280
6005165    false    37    7080
6005168    false    104    20140
6005169    false    35    6680
6005240    false    169    32140
......


运行:
c1="  perl -ne  'if(/.*\t(.*)/){\$sum+=\$1;}END{print \"\$sum\";}'  "
# 注意 这里 $ 要写成 \$    " 写成 \"
echo $c1; # 打印输出  perl -ne 'if(/.*"t(.*)/){$sum+=$1;}END{print $sum;}'
hadoop jar hadoop-0.18.3-streaming.jar
  
-input file:///data/hadoop/lky/jar/tt 
   -
mapper   "/bin/cat" 
   -
reducer "$c1" 
  
-output file:///tmp/lky/streamingx8


结果:
cat /tmp/lky/streamingx8/*
1166480

本地运行输出:
perl -ne 'if(/.*"t(.*)/){$sum+=$1;}END{print $sum;}' < tt
1166480

结果正确!!!!


命令自带文档:
-bash-3.00$ hadoop jar hadoop-0.18.3-streaming.jar -info
09/09/25 14:50:12 ERROR streaming.StreamJob: Missing required option -input
Usage: $HADOOP_HOME
/bin/hadoop [--config dir] jar \
          $HADOOP_HOME
/hadoop-streaming.jar [options]
Options:
  
-input    <path>     DFS input file(s) for the Map step
  
-output   <path>     DFS output directory for the Reduce step
  
-mapper   <cmd|JavaClassName>      The streaming command to run
  
-combiner <JavaClassName> Combiner has to be a Java class
  
-reducer  <cmd|JavaClassName>      The streaming command to run
  
-file     <file>     File/dir to be shipped in the Job jar file
  
-dfs    <h:p>|local  Optional. Override DFS configuration
  
-jt     <h:p>|local  Optional. Override JobTracker configuration
  
-additionalconfspec specfile  Optional.
  
-inputformat TextInputFormat(default)|SequenceFileAsTextInputFormat|JavaClassName Optional.
  
-outputformat TextOutputFormat(default)|JavaClassName  Optional.
  
-partitioner JavaClassName  Optional.
  
-numReduceTasks <num>  Optional.
  
-inputreader <spec>  Optional.
  
-jobconf  <n>=<v>    Optional. Add or override a JobConf property
  
-cmdenv   <n>=<v>    Optional. Pass env.var to streaming commands
  
-mapdebug <path>  Optional. To run this script when a map task fails 
  
-reducedebug <path>  Optional. To run this script when a reduce task fails 
  
-cacheFile fileNameURI
  
-cacheArchive fileNameURI
  
-verbose


posted @ 2009-09-25 14:33 刘凯毅 阅读(3346) | 评论 (0)编辑 收藏


什么都不说,在代码里
#!/usr/bin/env python
#
-*- encoding: utf8 -*-
from ftplib import FTP
import sys,os,getopt

opts,args
=getopt.getopt(sys.argv[1:],'hf:d:i:u:p:')

def usage():
    
print '''
Help Information:
  上传正常结束后,会在上次文件边创建成功状态文件夹,名称为 [上次文件名.state ]
    -h : Show help information
    -f : local upload file   eg -> /home/user/xx/file.tar
    -d : upload to ftp path  eg -> /x/xx/xxx 
    -i : [optional] Default 122.102.xx.xx
    -u : [optional] Default xx
    -p : [optional] Default *** (xx passwd)
    
'''


fip
='122.xx.xx.xx'
fur
='xx'
fpw
='123'
for o,a in opts:
    
if o=='-h':
        usage()
        sys.exit()
    
if o=='-f' : upload_file=a
    
if o=='-d' : ftp_path=a
    
if o=='-i' : fip=a
    
if o=='-u' : fur=a
    
if o=='-p' : fpw=a


ftp 
= FTP(fip)
ftp.login(fur,fpw)

if not ( locals().has_key('ftp_path'and locals().has_key('upload_file') ):
    usage()
    sys.exit()


# 迭代 创建 目录 
to_path='/'
for sp in ftp_path.split('/')[1:]:
    drs 
= ftp.nlst(to_path)
    
if to_path=='/':to_path+=sp
    
else : to_path+='/'+sp
    
if not to_path in drs :
        ftp.mkd(to_path)

#到 最终 目录下 
ftp.cwd(to_path)


# 上传准备
bufsize = 1024
file_handler 
= open(upload_file,'rb')
file_name
=os.path.split(upload_file)[1]

# 判定是否 有 上传完 状态文件夹,如果有删除
sfile=to_path+'/'+file_name+'.state'
if sfile in ftp.nlst(to_path):
    
print '[Resend] delete original dir state '+sfile
    ftp.rmd( sfile )
    
# 上传文件
ftp.storbinary('STOR %s' % (file_name),file_handler,bufsize)

# 如果 上传 文件大小不一 ,不标注 成功 上传 状态文件夹 
if not os.path.getsize(upload_file) == ftp.size(to_path+'/'+file_name) :
    
print '[Error]  upload to ftp size Different ! '
    sys.exit()

# 上传 成功 创建标示状态 文件夹 
ftp.mkd(sfile)
file_handler.close()
ftp.quit()


posted @ 2009-09-09 10:01 刘凯毅 阅读(1542) | 评论 (1)编辑 收藏

仅列出标题
共12页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last