标签为 Python 的文章

通过一道奇葩面试题来体验下awk的强大

面试题内容
需求:以"|"为分隔符,打印第一字段第一个字符是1,第二个字段第二个字符是2,第三个字段第三个字符是3,以此类推;倒数第二个字段前8个字符是当天日期如“20140610”。

源文件raw_data.txt:

$ date +%Y%m%d

我用Python实现的代码:
$ ./check_string.py

#!/usr/bin/env python

import datetime

def check_item(string):
    item_list = string.split('|')
    for item_id in range(0,len(item_list)):
        try:
            item_sub_list = list(item_list[item_id])
        except IndexError:
            return False

        special_item_id = len(item_list) - 2
        expect_item_sub_value = item_id + 1
        if item_id != special_item_id:
            try:
                if not item_sub_list[item_id] != expect_item_sub_value:
                    return False
            except IndexError:
                return False
        else:
            if not datetime.datetime.now().strftime("%Y%m%d") == ''.join(item_sub_list[0:8]):
                return False

    return True

if __name__=='__main__':
    filename = 'raw_data.txt'

    with open(filename) as fp:
        for line in fp:
            if check_item(line.replace('\n','')):
                print "Matched: {0}".format(line.replace('\n',''))

网友“运维@苏东”用awk实现的代码:
$ cat raw_data.txt | awk -F\| 'BEGIN{d=strftime("%Y%m%d")} { i=1;j=NF-1;k=0;while(i<j-1){if ( substr($i,i,1) == i ){k++;}; i++}; if (k==i-1 && substr($j,1,8) == d && substr($NF,NF,1) == NF) {print $0} }'

,

2 Comments

分享一个Oozie Job Debug脚本

参考资料:
https://oozie.apache.org/docs/4.0.0/WebServicesAPI.html

背景介绍:
在我们的线上Hadoop集群中,采用了Oozie来作为Workflow的管理,而平时有不少Workflow在执行过程中会因为各种问题而失败。
于是,我们通常都会通过Oozie Web Console去Troubleshooting,但是整个过程并不方便,在研究了Oozie API之后,我写了一个脚本来自动化的帮我们完成绝大部分的Troubleshooting步骤。

具体配置:
整个脚本需要模拟的Troubleshooting思路如下:
1. 获取整个Workflow所有步骤的信息,通常的状态有:OK,RUNNING,FAILED,KILLED,ERROR
2. 对FAILED,KILLED,ERROR状态的步骤,首先获取其consoleUrl,然后进一步获取更有价值的logsLinks,同时打印相关的调试信息,并导出该步骤的相关XML配置文件

脚本地址:https://github.com/mcsrainbow/python-demos/blob/master/demos/debug_oozie_job.py

执行示例:

, ,

No Comments

一道面试题

题目: 有一个长度是101的数组,存有1 ~ 100这100个数字,其中一个是重复的。请设计一个算法找出这个重复的数字

 
#!/usr/bin/env python
#-*- coding:utf-8 -*-

arr1 = [5,2,1,9,6,2,8]
arr2 = {}.fromkeys(arr1).keys()
print arr2
#效率高,但不符合题目要求

arr3 = list(set(arr1))
print arr3
#效率更高,但仍然不符合题目要求

arr4 = sorted(arr1)
i = len(arr4) - 1
for x in range(i):
    y = x + 1
    if arr4[x] == arr4[y]:
        print arr4[x]
#达到题目要求了,可惜面试时间已过
#当时怎么就没有想到用sorted这个方法呢
#还是自己技术太差了
#惭愧啊惭愧

有哪位前辈有效率更高的算法,还请告诉我这个菜鸟,谢谢。

12 Comments

在Python中使用Dict来传递参数

今天在帮Wianm修改一个Python脚本的时候,学到了一个有趣的东西,那就是如何在Python中使用Dict来传递参数。
在此之前我只会用{0} .format() 和 %s 的方式,将要传递的变量一个个的写在后面。

代码内容:

 
family = {"dad": "Dong", "mum": "Hong", "kid": "Yun"}
print "Dad:%(dad)s Mum:%(mum)s Kid:%(kid)s" % family 
print "Dad:%s Mum:%s Kid:%s" % tuple(family.values())

打印结果:

 
Dad:Dong Mum:Hong Kid:Yun
Dad:Dong Mum:Hong Kid:Yun

3 Comments

实现Zabbix通过邮件发送Screen图形报表

在使用Zabbix的过程中,我们通常会建立一些需要的Screen图形报表来汇总需要监控的Graph。
而下面的两个脚本,则是通过从Zabbix数据库中获取所有的Screen图形参数,提供Zabbix的WEB接口将所有图形保存到本地,然后通过脚本以Email形式发送过来,作为每天的自动报表。

$ sudo mkdir -p /data/script
$ sudo mkdir -p /data/graph

$ sudo vim /data/scripts/save-graph.pl

#!/usr/bin/perl
use File::Path;
use DBI;

my $path = '/data/graph';
if(-e $path) { rmtree($path); }
mkdir($path);

my $stime = `date +%Y%m%d`; chop($stime); $stime .= '1000';
if( length($stime) != 12 ) { print "Error get date"; exit; }

my $period = 86400;    # 24 hours

my $login = 'admin';   # Zabbix Web User
my $pass = 'password'; # Zabbix Web User Password, must be URL Encoded

my $cook = "/tmp/cookie";
my $dsn = 'DBI:mysql:zabbix:localhost'; # Connect MySQL DB "zabbix" on localhost
my $db_user_name = 'zabbix'; # MySQL DB user
my $db_password = 'dbpassword'; # MySQL DB user password

my $dbh = DBI->connect($dsn, $db_user_name, $db_password);
my $sth = $dbh->prepare(qq{select a.name,a.hsize,a.vsize, b.resourceid, b.width, b.height,b.x,b.y from screens a,screens_items as b where a.screenid=b.screenid and a.templateid<=>NULL order by a.name});
$sth->execute();
my %screens;

# Get all graphs by using curl
while (my ($name,$hsize,$vsize, $id,$width,$height,$x,$y) = $sth->fetchrow_array())
{
    if(length($id) > 2){
        #print "$id => $ids\n";
        my $p = "$path/$name.$hsize.$vsize.$y.$x.$id.png";
        my $strcomm  = `curl  -c $cook -b $cook -d "request=&name=$login&password=$pass&autologin=1&enter=Sign+in"  localhost/zabbix/index.php`;
        $strcomm  = `curl  -b $cook -F  "graphid=$id" -F "period=$period" -F "stime=$stime" -F "width=$width" -F "height=$height" localhost/zabbix/chart2.php > $p`;
    }
}

exit ;

阅读全文 »

, ,

15 Comments

Python学习笔记 No.1

Python学习笔记  No.1
Python的相关介绍

--------------------------------------------------------------------------------

什么是Python?
Python(发音:[ 'paiθ(ə)n; (US) 'paiθɔn ]),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。
Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。
这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行。
目前,基于这种语言的相关技术正在飞速的发展,用户数量急剧扩大,相关的资源非常多。
Python是如何诞生的?
Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为 ABC 语言的一种继承。
之所以选中 Python(大蟒蛇的意思)作为程序的名字,是因为他是一个Monty Python的飞行马戏团的爱好者。
ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。
但是ABC语言并没有成功,究其原因,Guido 认为是非开放造成的。Guido 决心在 Python 中避免这一错误(的确如此,Python 与其它的语言如C、C++和Java结合的非常好)。
同时,他还想实现在 ABC 中闪现过但未曾实现的东西。
就这样,Python在Guido手中诞生了。实际上,第一个实现是在Mac机上。
可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。

Python在编程语言中的定位是什么?
虽然 Python 可能被粗略地分类为"脚本语言(scripting language)", 实际上一些大规模软件开发计划例如 Zope, Mnet 及 BitTorrent. Google也广泛地使用它。
 Python 的支持者较喜欢称它为一种高阶动态编程语言 , 原因是"脚本语言" 泛指单用作简单编程任务如 shell scripts ,而Python不能与JavaScript等只能处理简单任务的编程语言相提并论。

Python有哪些特色?
可扩充性可说是Python作为一种编程语言的特色。新的内置模块(module)可以用C 或 C++写成。而我们也可为现成的模块加上Python的接口。Python可以使用户避免过分的语法的羁绊而将精力主要集中到所要实现的程序任务上。
Python也被称为是一门清晰的语言。因为它的作者在设计它的时候,总的指导思想是,对于一个特定的问题,只要有一种最好的方法来解决就好了。
Python语言是一种清晰的语言的另一个意思是,它的作者有意的设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。这样有意的强制程序员养成良好的编程习惯。其中很重要的一项就是Python的缩进规则。
一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言是用一对花括号{}来明确的定出模块的边界的,与字符的位置毫无关系)。这一点曾经引起过争议。因为自从C这类的语言诞生后,语言的语法含义与字符的排列方式分离开来,曾经被认为是一种程序语言的进步。
不过不可否认的是,通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。
另外Python在其他部分的设计上也坚持了清晰划一的风格,这使得Python称为一门易读性、易维护性好,并且被大量用户所欢迎的、用途广泛的语言。

Python目前有哪些局限?
虽然Python是一个非常成功的语言,但是也有必要明白它目前的局限。
1. 运行效率低下
目前为止,Python是所有主流脚本语言中速度比较慢的,这与其脚本引擎的设计思路有关。
如果你的应用对于速度有着较高的要求,就要考虑Python是否能满足需要。不过这一点可以通过使用C编写关键模块,然后由Python调用的方式加以部分解决。
2. 多线程支持欠佳
Python支持多线程,但是其运行效率也不高。
3. 适应其独特的语法
这也许不应该被称为局限,但是它用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员,也可能陷入陷阱当中。最常见的情况是tab和空格的混用会导致错误,而这是用肉眼无法分别的。

Python的发展前景如何?
Python在编程领域的占有率一直处于稳步上升之中,根据最新的数据,Python排名第七。前六名分别是Java,C,VB,C++,PHP和Perl. 作为一个很年轻的语言,Python的位置已经相当令人振奋了。
随着微软将Python纳入.Net 平台,相信Python的将来会更加强劲发展。Python 很可能会成为.Net平台快速开发的主流语言。
著名的搜索引擎 Google 也大量使用Python。更加令人吃惊的是,在Nokia智能手机所采用的Symbian操作系统上,Python成为继C++,Java之后的第三个编程语言!可见Python的影响力之巨大。

--------------------------------------------------------------------------------

 
 
Python相关资料

--------------------------------------------------------------------------------

Python的几个著名社区:
1.http://www.python.org/ Python 的官方网站
2.http://python.cn/ Python 中文社区
3.http://www.woodpecker.org.cn/ 啄木鸟 Pythonic 开源社区
4.http://bbs.chinaunix.net/forum-55-1.html ChinaUnix Python版块
 
Python的开发环境:
1.Linux:
几乎所有的Linux和BSD发行版中都默认安装了Python,且vim也默认支持Python的语法高亮与彩色编码,通过在vim中安装官方的Python相关插件可以获得更好的效果。
2.Windows:
推荐Pythonwin,它很小巧也很实用,尤其适合初学者。
Pythonwin集成开发环境包含在由ActiveState出品的ActivePython中,ActivePython是一个二进制build。其中包括用于XML处理的expat模块,以及一系列windows工具。
提供的特性有:彩色编码、源代码折叠、单词完成及自动缩进。调试器支持事后诊断功能、标准的单步调试、断点设计及变量监视。
详情请访问http://aspn.activestate.com/activepython,下载后直接安装即可通过工具进行Python编程,无需单独安装Python。
 
Python的相关书籍:
《简明Python教程》《Python学习笔记》《Python入门》《Python编码规范》《Dive.Into.Python中文版》
  以上这些书籍都可以在啄木鸟Pythonic 开源社区中找到。

No Comments