From 8cfaf7869c87e9e17f31462dbbcb2e7a136a365c Mon Sep 17 00:00:00 2001 From: XieYajie Date: Tue, 16 Feb 2016 14:16:09 +0800 Subject: [PATCH 01/24] =?UTF-8?q?=E5=B0=86=E4=BD=A0=E7=9A=84=20QQ=20?= =?UTF-8?q?=E5=A4=B4=E5=83=8F=EF=BC=88=E6=88=96=E8=80=85=E5=BE=AE=E5=8D=9A?= =?UTF-8?q?=E5=A4=B4=E5=83=8F=EF=BC=89=E5=8F=B3=E4=B8=8A=E8=A7=92=E5=8A=A0?= =?UTF-8?q?=E4=B8=8A=E7=BA=A2=E8=89=B2=E7=9A=84=E6=95=B0=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/0000/header.jpg | Bin 0 -> 3377 bytes xyjxyf/0000/image_add_num.py | 14 +++ xyjxyf/tools/README.md | 33 +++++++ xyjxyf/tools/__init__.py | 0 xyjxyf/tools/colorer.py | 24 +++++ xyjxyf/tools/imager.py | 170 +++++++++++++++++++++++++++++++++++ xyjxyf/tools/stringer.py | 25 ++++++ xyjxyf/tools/test.py | 6 ++ 8 files changed, 272 insertions(+) create mode 100644 xyjxyf/0000/header.jpg create mode 100644 xyjxyf/0000/image_add_num.py create mode 100644 xyjxyf/tools/README.md create mode 100644 xyjxyf/tools/__init__.py create mode 100644 xyjxyf/tools/colorer.py create mode 100644 xyjxyf/tools/imager.py create mode 100644 xyjxyf/tools/stringer.py create mode 100644 xyjxyf/tools/test.py diff --git a/xyjxyf/0000/header.jpg b/xyjxyf/0000/header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f4d8579117ad7b2dfddeec128fd6f1cb9e199ca GIT binary patch literal 3377 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 C6Zppf literal 0 HcmV?d00001 diff --git a/xyjxyf/0000/image_add_num.py b/xyjxyf/0000/image_add_num.py new file mode 100644 index 00000000..8a0a2cb5 --- /dev/null +++ b/xyjxyf/0000/image_add_num.py @@ -0,0 +1,14 @@ +# coding = utf-8 + +from tools import imager +from PIL import Image, ImageFont + +im = imager.open_image("./header.jpg") +if im is not None: + font = ImageFont.truetype('Arial.ttf', 20) + w, h = im.size + point = (w - 10, 0) + imager.draw_text(im, "8", point, font) + imager.save(im, "./header_tmp.jpg") + im.show() + diff --git a/xyjxyf/tools/README.md b/xyjxyf/tools/README.md new file mode 100644 index 00000000..eec10f4a --- /dev/null +++ b/xyjxyf/tools/README.md @@ -0,0 +1,33 @@ +# python_tools + +## imager.py + +图片处理 + +1. 打开 + +2. 保存 + +3. 大小 + +4. 拷贝 + +5. 裁剪 + +6. 压缩 + +7. 添加文字 + +8. 旋转 + +9. 转换色彩模式 + +10. 生成验证码图片 + +## checker.py + +检测指定的内容,可以在Xcode编译时显示警告或者错误提示 + +## replacer.py + +替换指定内容 \ No newline at end of file diff --git a/xyjxyf/tools/__init__.py b/xyjxyf/tools/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/xyjxyf/tools/colorer.py b/xyjxyf/tools/colorer.py new file mode 100644 index 00000000..6ddcb11c --- /dev/null +++ b/xyjxyf/tools/colorer.py @@ -0,0 +1,24 @@ +# coding = utf-8 + +import random + +def randRGB(min=0, max=255): + if min < 0: + min = 0 + if min > 255: + min = 255 + + if max < 0: + max = 0 + if max > 255: + max = 255 + + if max < min: + tmp = min + min = max + max = tmp + + return (random.randint(min, max), + random.randint(min, max), + random.randint(min, max)) + diff --git a/xyjxyf/tools/imager.py b/xyjxyf/tools/imager.py new file mode 100644 index 00000000..d3dba720 --- /dev/null +++ b/xyjxyf/tools/imager.py @@ -0,0 +1,170 @@ +# coding = utf-8 + +from PIL import Image, ImageDraw, ImageFont, ImageFilter +from tools import colorer, stringer +import types, os + + +# 打开 +def open_image(image_path=None): + if image_path is None or len(image_path) == 0: + return None + + im = Image.open(image_path) + return im + + +# 显示 +def show_image(image_path=None): + im = open_image(image_path) + im.show() + + +# 保存 +def save(image=None, to_path=None): + if image is None or to_path is None or len(to_path) == 0: + return + + f, e = os.path.splitext(to_path) + if e is None or len(e) == 0: + image.save(to_path, "JPEG") + else: + image.save(to_path) + + +# 大小 +def image_size(image=None): + ret_size = (0, 0) + + if image is None: + return ret_size + + return image.size + + +# 拷贝 +def image_copy(image=None): + if image is None: + return None + + return image.copy() + + +# 裁剪 +def image_crop(image=None, box=None): + if image is None or box is None: + return None + + return image.crop(box) + + +# 压缩 +def get_thumb(image=None, ratio=0.6): + if ratio > 1: + return image + if ratio <= 0 or image is None: + return None + + w, h = image.size() + + return image.thumbnail((w * ratio, h * ratio)) + +# # 合并 +# def paste(image=None, sub_image=None, origin=(0, 0)): +# if image is None or sub_image is None: +# return None +# +# im = image +# if type(image) is types.StringType: +# im = Image.open(image) +# if im is None: +# return None +# +# sub_im = sub_image +# if type(sub_image) is types.StringType: +# sub_im = Image.open(sub_image) +# if sub_im is None: +# return None +# +# im_size = im.size +# sub_size = sub_im.size +# # 如果sub_image在image范围内,不需要创建新的图片 +# if origin[0] >= 0 and origin[1] >= 0: +# right = origin[0] + sub_size[0] +# bottom = origin[1] + sub_size[1] +# if right <= im.size[0] and bottom <= im_size[1]: +# return im.paste(sub_im, (origin(0), origin(1), right, bottom)) +# +# right = im_size(0) +# if im_size(0) < sub_size(0): +# width = sub_size(0) +# height = im_size(1) +# if im_size(1) < sub_size(1): +# height = sub_size(1) +# +# +# image = Image.new('RGB', (width, height), (255, 255, 255)) +# +# +# return im.paste(sub_im, box) + + +# 添加文字 +def draw_text(image=None, text=None, origin=(0, 0), font=None, fill='red'): + if image is None or text is None or len(text) == 0: + return None + + context = ImageDraw.Draw(image) + context.text(origin, text, font=font, fill=fill) + return image + + +# 旋转 +def image_rotate(image=None, rotate=0): + + if image is None: + return None + + if rotate == 0: + return image + + return image.rotate(rotate) + + +# 转换色彩模式, mode: 'P'虚化,'L'或者'1'黑白,'LA'怀旧 +def image_convert(image=None, mode='P'): + if image is None: + return None + + return image.convert(mode) + + +# 生成验证码图片:数字和字母 +def verification_code(num=4, width=240, height=60, font_size=30): + image = Image.new('RGB', (width, height), (255, 255, 255)) + font = ImageFont.truetype('Arial.ttf', font_size) + draw = ImageDraw.Draw(image) + + # 背景填充 + for x in range(width): + for y in range(height): + draw.point((x, y), colorer.randRGB(min=64)) + + # 文字 + tw = width / num + margin = (tw - font_size) / 2 + ty = (height - font_size) / 2 + tx = margin + str = "" + for t in range(num): + char = stringer.rand_choice() + draw.text((tx, ty), char, font=font, fill=colorer.randRGB(0, 100)) + tx = tx + tw + str = str + char + + # 模糊效果 + image = image.filter(ImageFilter.BLUR) + + return image, str + +# 生成中文验证码 diff --git a/xyjxyf/tools/stringer.py b/xyjxyf/tools/stringer.py new file mode 100644 index 00000000..e8b7e168 --- /dev/null +++ b/xyjxyf/tools/stringer.py @@ -0,0 +1,25 @@ +# coding = utf-8 + +import random, string + +# def Unicode(): +# val = random.randint(0x4E00, 0x9FBF) +# return unichr(val) +# +# # 随机汉字 +# def GB2312(): +# head = random.randint(0xB0, 0xCF) +# body = random.randint(0xA, 0xF) +# tail = random.randint(0, 0xF) +# val = ( head << 8 ) | (body << 4) | tail +# str = "%x" % val +# return str.decode('hex').decode('gb2312') + +# 随机字母 +def rand_char(): + return chr(random.randint(65, 90)) + +# 随机字母或者数字 +def rand_choice(): + str = 'abcdefghigklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM1234567890' + return random.choice(str) \ No newline at end of file diff --git a/xyjxyf/tools/test.py b/xyjxyf/tools/test.py new file mode 100644 index 00000000..403f81f6 --- /dev/null +++ b/xyjxyf/tools/test.py @@ -0,0 +1,6 @@ +# coding = utf-8 + +import imager + +im, str = imager.verification_code() +im.show() \ No newline at end of file From 1542a15ff1f0935bb6cf48aac020789189318f45 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Tue, 16 Feb 2016 14:16:48 +0800 Subject: [PATCH 02/24] update test --- xyjxyf/tools/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xyjxyf/tools/test.py b/xyjxyf/tools/test.py index 403f81f6..52a91f05 100644 --- a/xyjxyf/tools/test.py +++ b/xyjxyf/tools/test.py @@ -1,6 +1,6 @@ # coding = utf-8 -import imager +from tools import imager im, str = imager.verification_code() im.show() \ No newline at end of file From 08acd3aa61dbb584daadc8c8fafa855bdd2a7e73 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Tue, 16 Feb 2016 14:22:02 +0800 Subject: [PATCH 03/24] update --- xyjxyf/0000/image_add_num.py | 14 -------------- xyjxyf/{0000 => }/header.jpg | Bin xyjxyf/show_me_the_code.py | 18 ++++++++++++++++++ 3 files changed, 18 insertions(+), 14 deletions(-) delete mode 100644 xyjxyf/0000/image_add_num.py rename xyjxyf/{0000 => }/header.jpg (100%) create mode 100644 xyjxyf/show_me_the_code.py diff --git a/xyjxyf/0000/image_add_num.py b/xyjxyf/0000/image_add_num.py deleted file mode 100644 index 8a0a2cb5..00000000 --- a/xyjxyf/0000/image_add_num.py +++ /dev/null @@ -1,14 +0,0 @@ -# coding = utf-8 - -from tools import imager -from PIL import Image, ImageFont - -im = imager.open_image("./header.jpg") -if im is not None: - font = ImageFont.truetype('Arial.ttf', 20) - w, h = im.size - point = (w - 10, 0) - imager.draw_text(im, "8", point, font) - imager.save(im, "./header_tmp.jpg") - im.show() - diff --git a/xyjxyf/0000/header.jpg b/xyjxyf/header.jpg similarity index 100% rename from xyjxyf/0000/header.jpg rename to xyjxyf/header.jpg diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py new file mode 100644 index 00000000..7ba792a6 --- /dev/null +++ b/xyjxyf/show_me_the_code.py @@ -0,0 +1,18 @@ +# coding = utf-8 + +from tools import imager +from PIL import Image, ImageFont + +# 第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字 +def add_num(image_path): + im = imager.open_image(image_path) + if im is not None: + font = ImageFont.truetype('Arial.ttf', 20) + w, h = im.size + point = (w - 10, 0) + imager.draw_text(im, "8", point, font) + # imager.save(im, "./header_tmp.jpg") + im.show() + +if __name__ == "__main__": + add_num("./header.jpg") \ No newline at end of file From c291c3f68f2e9136ffaf8430bdb5b0c5d916e72e Mon Sep 17 00:00:00 2001 From: XieYajie Date: Tue, 16 Feb 2016 14:24:48 +0800 Subject: [PATCH 04/24] add 0010 --- xyjxyf/show_me_the_code.py | 10 ++++++++-- xyjxyf/tools/imager.py | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 7ba792a6..2e0db558 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -11,8 +11,14 @@ def add_num(image_path): w, h = im.size point = (w - 10, 0) imager.draw_text(im, "8", point, font) - # imager.save(im, "./header_tmp.jpg") im.show() + +# 第 0010 题:使用 Python 生成字母验证码图片 +def create_verification_code(): + im, str = imager.verification_code() + im.show() + if __name__ == "__main__": - add_num("./header.jpg") \ No newline at end of file + # add_num("./header.jpg") + # create_verification_code() \ No newline at end of file diff --git a/xyjxyf/tools/imager.py b/xyjxyf/tools/imager.py index d3dba720..4bf90ecc 100644 --- a/xyjxyf/tools/imager.py +++ b/xyjxyf/tools/imager.py @@ -157,7 +157,7 @@ def verification_code(num=4, width=240, height=60, font_size=30): tx = margin str = "" for t in range(num): - char = stringer.rand_choice() + char = stringer.rand_char() draw.text((tx, ty), char, font=font, fill=colorer.randRGB(0, 100)) tx = tx + tw str = str + char From cc184e34b5bf2197ba5b24c8c09e95264af029b5 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Tue, 16 Feb 2016 14:31:10 +0800 Subject: [PATCH 05/24] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/show_me_the_code.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 2e0db558..4dfc4731 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -14,6 +14,26 @@ def add_num(image_path): im.show() +# 第 0001 题:使用 Python 生成 200 个激活码(或者优惠券) +# def create_activation_code(num=200): + +# 第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。 + +# 第 0003 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 Redis 非关系型数据库中。 + +# 第 0004 题:任一个英文的纯文本文件,统计其中的单词出现的个数。 + +# 第 0005 题:你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小。 + +# 第 0006 题:你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。 + +# 第 0007 题:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。 + +# 第 0008 题:一个HTML文件,找出里面的正文。 + +# 第 0009 题:一个HTML文件,找出里面的链接。 + + # 第 0010 题:使用 Python 生成字母验证码图片 def create_verification_code(): im, str = imager.verification_code() From f5ff3a29ff96a4a5cb5bef8c8d11d3c70c80ec1d Mon Sep 17 00:00:00 2001 From: XieYajie Date: Mon, 22 Feb 2016 15:54:58 +0800 Subject: [PATCH 06/24] =?UTF-8?q?=E7=94=9F=E6=88=90=E9=9A=8F=E6=9C=BA?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/show_me_the_code.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 4dfc4731..93fc7e8a 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -1,7 +1,8 @@ # coding = utf-8 from tools import imager -from PIL import Image, ImageFont +from PIL import ImageFont + # 第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字 def add_num(image_path): @@ -14,8 +15,17 @@ def add_num(image_path): im.show() +import uuid # 第 0001 题:使用 Python 生成 200 个激活码(或者优惠券) -# def create_activation_code(num=200): +def create_activation_code(num=200): + codes = [] + for i in range(num): + code = str(uuid.uuid1()) + code = code.replace('-', '') + codes.append(code) + + return codes + # 第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。 @@ -41,4 +51,5 @@ def create_verification_code(): if __name__ == "__main__": # add_num("./header.jpg") - # create_verification_code() \ No newline at end of file + # create_verification_code() + create_activation_code() \ No newline at end of file From 8f0f6d6a9d4f1da1cf04901fca3a340f4df37665 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Mon, 22 Feb 2016 16:39:50 +0800 Subject: [PATCH 07/24] =?UTF-8?q?0004:=20=E8=8E=B7=E5=8F=96=E7=BA=AF?= =?UTF-8?q?=E8=8B=B1=E6=96=87=E6=96=87=E4=BB=B6=E4=B8=AD=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E4=B8=AA=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/{header.jpg => 0000.jpg} | Bin xyjxyf/0004.txt | 4 ++++ xyjxyf/show_me_the_code.py | 30 ++++++++++++++++++++++++++++-- 3 files changed, 32 insertions(+), 2 deletions(-) rename xyjxyf/{header.jpg => 0000.jpg} (100%) create mode 100644 xyjxyf/0004.txt diff --git a/xyjxyf/header.jpg b/xyjxyf/0000.jpg similarity index 100% rename from xyjxyf/header.jpg rename to xyjxyf/0000.jpg diff --git a/xyjxyf/0004.txt b/xyjxyf/0004.txt new file mode 100644 index 00000000..cf950a09 --- /dev/null +++ b/xyjxyf/0004.txt @@ -0,0 +1,4 @@ + +Henry was a pen name used by an American writer of short stories. + +His real name was William Sydney Porter. diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 93fc7e8a..9c839214 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -32,6 +32,24 @@ def create_activation_code(num=200): # 第 0003 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 Redis 非关系型数据库中。 # 第 0004 题:任一个英文的纯文本文件,统计其中的单词出现的个数。 +import re + + +def numberOfWords(filePath=None): + num = 0 + + if filePath is None: + return num + + file = open(filePath, 'r') + content = file.read() + content = " " + content + pattern = re.compile(u'\s+\w+') + match = pattern.findall(content) + num = len(match) + + return num + # 第 0005 题:你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小。 @@ -50,6 +68,14 @@ def create_verification_code(): im.show() if __name__ == "__main__": - # add_num("./header.jpg") + # 0000 + # add_num("./0000.jpg") + + # 0001 + # create_activation_code() + + #0004 + numberOfWords("./0004.txt") + + # 0010 # create_verification_code() - create_activation_code() \ No newline at end of file From d7aa7ce4801dfcfad046c69dc7e011285b8d982b Mon Sep 17 00:00:00 2001 From: XieYajie Date: Tue, 23 Feb 2016 18:19:37 +0800 Subject: [PATCH 08/24] =?UTF-8?q?0007:=20=E8=AE=A1=E7=AE=97=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=A1=8C=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/0007/stringer.py | 29 +++++++++++++++ xyjxyf/show_me_the_code.py | 73 +++++++++++++++++++++++++++++++++----- 2 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 xyjxyf/0007/stringer.py diff --git a/xyjxyf/0007/stringer.py b/xyjxyf/0007/stringer.py new file mode 100644 index 00000000..56d9d3b3 --- /dev/null +++ b/xyjxyf/0007/stringer.py @@ -0,0 +1,29 @@ +# coding = utf-8 + +import random, string + +/* +sdfhjdsf +hgjh +*/ +# def Unicode(): +# val = random.randint(0x4E00, 0x9FBF) +# return unichr(val) +# +# # 随机汉字 +# def GB2312(): +# head = random.randint(0xB0, 0xCF) +# body = random.randint(0xA, 0xF) +# tail = random.randint(0, 0xF) +# val = ( head << 8 ) | (body << 4) | tail +# str = "%x" % val +# return str.decode('hex').decode('gb2312') + +# 随机字母 +def rand_char(): + return chr(random.randint(65, 90)) + +# 随机字母或者数字 +def rand_choice(): + str = 'abcdefghigklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM1234567890' + return random.choice(str) diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 9c839214..e7d05cb0 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -15,8 +15,9 @@ def add_num(image_path): im.show() -import uuid # 第 0001 题:使用 Python 生成 200 个激活码(或者优惠券) +import uuid + def create_activation_code(num=200): codes = [] for i in range(num): @@ -34,14 +35,13 @@ def create_activation_code(num=200): # 第 0004 题:任一个英文的纯文本文件,统计其中的单词出现的个数。 import re - -def numberOfWords(filePath=None): +def number_of_words(file_path=None): num = 0 - if filePath is None: + if file_path is None: return num - file = open(filePath, 'r') + file = open(file_path, 'r') content = file.read() content = " " + content pattern = re.compile(u'\s+\w+') @@ -55,7 +55,60 @@ def numberOfWords(filePath=None): # 第 0006 题:你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。 -# 第 0007 题:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。 +# 第 0007 题:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来 +import os + +# 注释://, #, /* */, """ """, ''' ''' +def lines_of_codes(dir_path=None): + code_num = 0 + note_num = 0 + blank_line_num = 0 + if dir_path is None: + return code_num, note_num, blank_line_num + + for root, dirs, files in os.walk(dir_path): + mut_note = None + for path in files: + if path.startswith("."): + continue + + file_path = os.path.join(root, path) + for count, line in enumerate(open(file_path, "rU")): + + # 判断是否是空行 + if not line.split(): + blank_line_num += 1 + continue + + # 判断是否多行注释 + if mut_note is not None: + note_num += 1 + match_note = re.match("\*/|\"\"\"|\'\'\'", line) + if match_note is not None: + mut_note = None + match_note = re.match("\/\*|\"\"\"|\'\'\'", line) + if match_note is not None: + mut_note = line[match_note.pos:(match_note.endpos - 1)] + + continue + else: + match_note = re.match("\/\*|\"\"\"|\'\'\'", line) + if match_note is not None: + note_num += 1 + mut_note = line[match_note.pos:(match_note.endpos - 1)] + continue + + # 判断单行注释 + match_note1 = re.match("\s*(#|//).*\n*", line) + if match_note1 is not None: + note_num += 1 + continue + + pass + + code_num += count + 1 + + return code_num, note_num, blank_line_num # 第 0008 题:一个HTML文件,找出里面的正文。 @@ -74,8 +127,12 @@ def create_verification_code(): # 0001 # create_activation_code() - #0004 - numberOfWords("./0004.txt") + # 0004 + # number_of_words("./0004.txt") + + # 0007 + code, note, blank_line = lines_of_codes("./0007") + print("代码行数:%i\n注释行数:%i\n空行行数:%i" % (code, note, blank_line)) # 0010 # create_verification_code() From f4af2b741d2f488727df57ce6b0ebdf0109bbffc Mon Sep 17 00:00:00 2001 From: XieYajie Date: Fri, 26 Feb 2016 19:05:19 +0800 Subject: [PATCH 09/24] =?UTF-8?q?0005:=20=E6=9C=89=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=EF=BC=8C=E8=A3=85=E4=BA=86=E5=BE=88=E5=A4=9A?= =?UTF-8?q?=E7=85=A7=E7=89=87=EF=BC=8C=E6=8A=8A=E5=AE=83=E4=BB=AC=E7=9A=84?= =?UTF-8?q?=E5=B0=BA=E5=AF=B8=E5=8F=98=E6=88=90=E9=83=BD=E4=B8=8D=E5=A4=A7?= =?UTF-8?q?=E4=BA=8E=20iPhone5=20=E5=88=86=E8=BE=A8=E7=8E=87=E7=9A=84?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/0005/1.jpg | Bin 0 -> 3377 bytes xyjxyf/0005/2.jpg | Bin 0 -> 22014 bytes xyjxyf/show_me_the_code.py | 26 ++++++++++++++++++++++++-- xyjxyf/tools/imager.py | 19 +++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 xyjxyf/0005/1.jpg create mode 100644 xyjxyf/0005/2.jpg diff --git a/xyjxyf/0005/1.jpg b/xyjxyf/0005/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f4d8579117ad7b2dfddeec128fd6f1cb9e199ca GIT binary patch literal 3377 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 C6Zppf literal 0 HcmV?d00001 diff --git a/xyjxyf/0005/2.jpg b/xyjxyf/0005/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..177dfc8e92b2299bac23c03e021e79509125a4f8 GIT binary patch literal 22014 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 1: + new_width = max_width + new_height = max_width / rotate + else: + new_height = max_height + new_width = max_height * rotate + + new_image = image.resize((int(new_width), int(new_height)), Image.BILINEAR) + return new_image From d961e5021f19598d27815bed1a0052ed2a0cc993 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Mon, 7 Mar 2016 14:31:05 +0800 Subject: [PATCH 10/24] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=B0redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/show_me_the_code.py | 56 +++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 7962b8a3..446ee4e8 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -29,9 +29,43 @@ def create_activation_code(num=200): # 第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。 +import pymysql + +def save_activation_code_to_mysql(): + conn = pymysql.connect(host='127.0.0.1', user='root', charset='UTF8') + cur = conn.cursor() + cur.execute("CREATE DATABASE IF NOT EXISTS code_mysql") + cur.execute("USE code_mysql") + cur.execute("CREATE TABLE IF NOT EXISTS codes (id INT, code VARCHAR(255))") + + codes = create_activation_code(200) + for code in codes: + cur.execute("INSERT INTO codes (code) values(%s)", [code]) + + conn.commit() + + cur.execute("SELETE * FROM codes") + data = cur.fetchall() + print("data:%s" % data) + + cur.close() + conn.close() + # 第 0003 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 Redis 非关系型数据库中。 +import redis + +def save_activation_code_to_redis(): + re = redis.Redis(host='127.0.0.1', port=6379, db=0) + + codes = create_activation_code(200) + for code in codes: + re.lpop('codes', code) + + print("data:%s" % re.get('codes')) + + # 第 0004 题:任一个英文的纯文本文件,统计其中的单词出现的个数。 import re @@ -127,6 +161,17 @@ def lines_of_codes(dir_path=None): # 第 0008 题:一个HTML文件,找出里面的正文。 # 第 0009 题:一个HTML文件,找出里面的链接。 +from urllib import request + +def get_html_links(url=None): + url_list = [] + if url is None: + return url_list + + content = request.urlopen(url).read() + + match = re.findall("", content) + # 第 0010 题:使用 Python 生成字母验证码图片 @@ -143,18 +188,27 @@ def create_verification_code(): # create_activation_code() # 0002 + # save_activation_code_to_mysql() # 0003 + # codes = create_activation_code(200) + save_activation_code_to_redis() # 0004 # number_of_words("./0004.txt") # 0005 - reset_images_size("./0005") + # reset_images_size("./0005") + + # 0006 # 0007 # code, note, blank_line = lines_of_codes("./0007") # print("代码行数:%i\n注释行数:%i\n空行行数:%i" % (code, note, blank_line)) + # 0008 + + # 0009 + # 0010 # create_verification_code() From 30f97d52bfe648a2bac3daf107f86de9200ac054 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Mon, 7 Mar 2016 15:26:16 +0800 Subject: [PATCH 11/24] =?UTF-8?q?readme=EF=BC=9A=20mac=E5=AE=89=E8=A3=85re?= =?UTF-8?q?dis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/README.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 xyjxyf/README.md diff --git a/xyjxyf/README.md b/xyjxyf/README.md new file mode 100644 index 00000000..f579e43b --- /dev/null +++ b/xyjxyf/README.md @@ -0,0 +1,55 @@ +xyjxyf Notes +====== +## Mac上安装Redis + +1. 下载源文件 + +[redis-3.0.7.rar.gz](http://download.redis.io/releases/) + +2. 安装 + +``` +$ tar -zxvf redis-3.0.6.tar.gz +$ cd redis-3.0.7 +$ make test +$ make install +``` + +3. 配置 + +``` +$ vi ./redis.conf + + # 设置为后台运行 +daemonize yes + + # 设置pid文件位置 +pidfile /usr/local/redis/redis.pid + + # 连接超时时间设置为120秒 +timeout 120 + + # 设置日志级别 +loglevel debug + + # 设置日志文件位置 +logfile "/usr/local/redis/log/6379.log" + + # 数据文件所在目录 +dir /usr/local/redis/data/6379 +``` + +4. 启动redis服务器 + +``` +$ ./redis-server +``` + +5. 安装Python的Redis模块 + +我的mac安装了python双版本,用python3 + + +``` +$ pip3 install redis +``` \ No newline at end of file From e1e46df1039acf9fb8afb5023edb97b0b7f197b6 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Fri, 11 Mar 2016 10:40:24 +0800 Subject: [PATCH 12/24] =?UTF-8?q?add:=200006=20=E7=BB=9F=E8=AE=A1=E5=87=BA?= =?UTF-8?q?=E8=AE=A4=E4=B8=BA=E6=AF=8F=E7=AF=87=E6=97=A5=E8=AE=B0=E6=9C=80?= =?UTF-8?q?=E9=87=8D=E8=A6=81=E7=9A=84=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/0006/00061.txt | 12 ++++++++ xyjxyf/0006/00062.txt | 7 +++++ xyjxyf/show_me_the_code.py | 56 +++++++++++++++++++++++++++++++++++--- 3 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 xyjxyf/0006/00061.txt create mode 100644 xyjxyf/0006/00062.txt diff --git a/xyjxyf/0006/00061.txt b/xyjxyf/0006/00061.txt new file mode 100644 index 00000000..48ba0476 --- /dev/null +++ b/xyjxyf/0006/00061.txt @@ -0,0 +1,12 @@ + +Henry was a pen name used by an American writer of short stories. + +His + +His + +His + +His + +Henry was a pen name used by an American writer of short stories. diff --git a/xyjxyf/0006/00062.txt b/xyjxyf/0006/00062.txt new file mode 100644 index 00000000..af894a51 --- /dev/null +++ b/xyjxyf/0006/00062.txt @@ -0,0 +1,7 @@ + +Henry was a pen name used by an American writer of short stories. + +His real name was William Sydney Porter. + +pen pen +pen pen pen pen pen pen diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 446ee4e8..6f26c414 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -32,7 +32,7 @@ def create_activation_code(num=200): import pymysql def save_activation_code_to_mysql(): - conn = pymysql.connect(host='127.0.0.1', user='root', charset='UTF8') + conn = pymysql.connect(host='localhost', user='root', charset='UTF8') cur = conn.cursor() cur.execute("CREATE DATABASE IF NOT EXISTS code_mysql") cur.execute("USE code_mysql") @@ -101,7 +101,37 @@ def reset_images_size(dir_path=None): new_image = imager.reset_image_size(image, 640, 1136) imager.save(new_image, file_path) -# 第 0006 题:你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。 + +# 第 0006 题:你有一个目录,放了你一个月的日记,都是 txt, +# 为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。 +# 思路:哪个词出现的最多,哪个词就是最重要的词 +import operator + +def get_most_important_word(dir_path=None): + if dir_path is None: + return None + + for root, dirs, files in os.walk(dir_path): + for path in files: + if not path.endswith("txt"): + continue + + file_path = os.path.join(root, path) + content = open(file_path, 'r').read().lower() + + words = content.split() + word_dic = {} + for word in words: + if word in word_dic.keys(): + word_dic[word] += 1 + else: + word_dic[word] = 1 + + if len(word_dic): + word_list = sorted(word_dic.items(), key=lambda x:x[1], reverse=True) + print("%s : %s -- %d" % (path, word_list[0][0], word_list[0][1])) + + # 第 0007 题:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来 import os @@ -180,6 +210,18 @@ def create_verification_code(): im.show() +# 第 0011 题: 敏感词文本文件 filtered_words.txt,里面的内容为以下内容, +# 北京, 程序员, 公务员, 领导, 牛比, 牛逼, 你娘, 你妈, love, sex, jiangge +# 当用户输入敏感词语时,则打印出 Freedom,否则打印出 Human Rights。 + + +# 第 0012 题: 敏感词文本文件 filtered_words.txt,里面的内容 和 0011题一样, +# 当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成「**是个好城市」。 + + +# 第 0013 题: 用 Python 写一个爬图片的程序 + + if __name__ == "__main__": # 0000 # add_num("./0000.jpg") @@ -191,8 +233,7 @@ def create_verification_code(): # save_activation_code_to_mysql() # 0003 - # codes = create_activation_code(200) - save_activation_code_to_redis() + # save_activation_code_to_redis() # 0004 # number_of_words("./0004.txt") @@ -201,6 +242,7 @@ def create_verification_code(): # reset_images_size("./0005") # 0006 + get_most_important_word("./0006") # 0007 # code, note, blank_line = lines_of_codes("./0007") @@ -212,3 +254,9 @@ def create_verification_code(): # 0010 # create_verification_code() + + # 0011 + + # 0012 + + # 0013 From 824adcb0f54de1600ded9820c44ead56f095af5e Mon Sep 17 00:00:00 2001 From: XieYajie Date: Fri, 11 Mar 2016 15:14:42 +0800 Subject: [PATCH 13/24] =?UTF-8?q?add:=200011=20=E6=9F=A5=E6=89=BE=E6=95=8F?= =?UTF-8?q?=E6=84=9F=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/0011/0011.txt | 11 ++++++++ xyjxyf/show_me_the_code.py | 52 +++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 xyjxyf/0011/0011.txt diff --git a/xyjxyf/0011/0011.txt b/xyjxyf/0011/0011.txt new file mode 100644 index 00000000..693f4665 --- /dev/null +++ b/xyjxyf/0011/0011.txt @@ -0,0 +1,11 @@ +北京 +程序员 +公务员 +领导 +牛比 +牛逼 +你娘 +你妈 +love +sex +jiangge diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 6f26c414..d8771105 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -189,15 +189,18 @@ def lines_of_codes(dir_path=None): return code_num, note_num, blank_line_num # 第 0008 题:一个HTML文件,找出里面的正文。 +def get_html_context(url=None): + if url is None: + return None # 第 0009 题:一个HTML文件,找出里面的链接。 from urllib import request def get_html_links(url=None): - url_list = [] if url is None: - return url_list + return None + url_list = [] content = request.urlopen(url).read() match = re.findall("", content) @@ -214,6 +217,22 @@ def create_verification_code(): # 北京, 程序员, 公务员, 领导, 牛比, 牛逼, 你娘, 你妈, love, sex, jiangge # 当用户输入敏感词语时,则打印出 Freedom,否则打印出 Human Rights。 +def find_sensitive_words(sensitive_file=None, input_string=None): + if sensitive_file is None or input_string is None: + return None + + file = open(sensitive_file, "r") + sensitive_words = file.read().split() + + is_sensitive = False + for sensitive in sensitive_words: + if sensitive in input_string: + is_sensitive = True + print("Freedom") + + if not is_sensitive: + print("Human Rights") + # 第 0012 题: 敏感词文本文件 filtered_words.txt,里面的内容 和 0011题一样, # 当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成「**是个好城市」。 @@ -229,7 +248,7 @@ def create_verification_code(): # 0001 # create_activation_code() - # 0002 + # 0002 ????? # save_activation_code_to_mysql() # 0003 @@ -242,7 +261,7 @@ def create_verification_code(): # reset_images_size("./0005") # 0006 - get_most_important_word("./0006") + # get_most_important_word("./0006") # 0007 # code, note, blank_line = lines_of_codes("./0007") @@ -256,7 +275,32 @@ def create_verification_code(): # create_verification_code() # 0011 + find_sensitive_words("./0011/0011.txt", "haha") # 0012 # 0013 + + # 0014 + + # 0015 + + # 0016 + + # 0017 + + # 0018 + + # 0019 + + # 0020 + + # 0021 + + # 0022 + + # 0023 + + # 0024 + + # 0025 From 15cfecf216f4fb7d456262e5719baa9347980b62 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Fri, 11 Mar 2016 15:31:18 +0800 Subject: [PATCH 14/24] =?UTF-8?q?add=200012:=20=E6=9B=BF=E6=8D=A2=E6=95=8F?= =?UTF-8?q?=E6=84=9F=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/show_me_the_code.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index d8771105..117a7ad7 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -237,6 +237,19 @@ def find_sensitive_words(sensitive_file=None, input_string=None): # 第 0012 题: 敏感词文本文件 filtered_words.txt,里面的内容 和 0011题一样, # 当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成「**是个好城市」。 +def replace_sensitive_words(sensitive_file=None, input_string=None): + if sensitive_file is None or input_string is None: + return None + + file = open(sensitive_file, "r") + sensitive_words = file.read().split() + + for sensitive in sensitive_words: + if sensitive in input_string: + replace_str = "*" * len(sensitive) + input_string = input_string.replace(sensitive, replace_str) + + print(input_string) # 第 0013 题: 用 Python 写一个爬图片的程序 @@ -275,9 +288,10 @@ def find_sensitive_words(sensitive_file=None, input_string=None): # create_verification_code() # 0011 - find_sensitive_words("./0011/0011.txt", "haha") + # find_sensitive_words("./0011/0011.txt", "haha, 北京不错") # 0012 + # replace_sensitive_words("./0011/0011.txt", "haha, 北京不错") # 0013 From 138c20a16c5efce7965d622615fa63e7d15b7747 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Fri, 18 Mar 2016 10:41:16 +0800 Subject: [PATCH 15/24] =?UTF-8?q?=E5=B0=86=E5=AD=97=E5=85=B8=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=9A=84=E6=96=87=E6=9C=AC=E5=86=99=E5=85=A5xls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/0014/student.txt | 5 +++++ xyjxyf/0014/student.xls | Bin 0 -> 5632 bytes xyjxyf/0015/city.txt | 5 +++++ xyjxyf/0015/city.xls | Bin 0 -> 5632 bytes xyjxyf/show_me_the_code.py | 45 ++++++++++++++++++++++++++++++++++++- 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 xyjxyf/0014/student.txt create mode 100644 xyjxyf/0014/student.xls create mode 100644 xyjxyf/0015/city.txt create mode 100644 xyjxyf/0015/city.xls diff --git a/xyjxyf/0014/student.txt b/xyjxyf/0014/student.txt new file mode 100644 index 00000000..ea9b1593 --- /dev/null +++ b/xyjxyf/0014/student.txt @@ -0,0 +1,5 @@ +{ + "1":["张三",150,120,100], + "2":["李四",90,99,95], + "3":["王五",60,66,68] +} \ No newline at end of file diff --git a/xyjxyf/0014/student.xls b/xyjxyf/0014/student.xls new file mode 100644 index 0000000000000000000000000000000000000000..b80d5719531492f406e40788c7e799dad350887d GIT binary patch literal 5632 zcmeHLO=uHQ5dL<%Lh?Qs%n^ z6L&n%$bm)P2XP#UsZ2VyinK%fkTj$Z1LOv7QWL~_?NvniVdZO--&W7Z%7;{QQTYHO zC>oPa!0c38klet1ZSz(&eQ3jT`dDW!%VMY1i|yH?$;m&{(BWyuJUDN| z=}bDCoGc>B37p4QD+YX#0SG;fx%$<`!9Wc7COL&{{C%94YW-Ey1I)lWqzgQcRumef zg%8uY6RC72w}fupk+LhfAp5vpV`G5?#jO+*N8atD*iZ4o^tD72o$T!#s@Tpgy3Cu& zQ_LVsKCFv91V5H;eR{Qfd?Y@mni*<@7!(_&Z?JGyTCj0Y416gFd3pC}i!I8}i4QiY z+^#%IA8y^Qk+v0K*R1-SS8EsZ^eerNZz_{FQ_g?f^PnUDA>K`SVYqZEy6`4GhfcnD zQp_ROEP9PzC(T6z+O!8${~iG$gs@fBxk;US_`k?AR}w39&-K{ xitm1A&td}O+K-8PnpgPnqwi;a=|_dJR>l4rtmRR!?U(bHkH6j|HT-@n{|~kC%|ieH literal 0 HcmV?d00001 diff --git a/xyjxyf/0015/city.txt b/xyjxyf/0015/city.txt new file mode 100644 index 00000000..312f5c19 --- /dev/null +++ b/xyjxyf/0015/city.txt @@ -0,0 +1,5 @@ +{ + "1" : "上海", + "2" : "北京", + "3" : "成都" +} \ No newline at end of file diff --git a/xyjxyf/0015/city.xls b/xyjxyf/0015/city.xls new file mode 100644 index 0000000000000000000000000000000000000000..b020435b2949421ce0a19350dde0f784fe6daaf5 GIT binary patch literal 5632 zcmeHLO=uHQ5dLOy-M9N{ zJziXX&{;wa4WkL)-7uOf^cLl?-;aTI*Oji{hA2~I=pRBL9AY7xgLvAu)*`i(dY541 ze&7W;@PX$UTtIp@mrZRU9nu`eEy-bs+`?^YqS&cfC6rGn-=_SYdOlM=qMGZJC(*8Q zTxWU=A#B|F{Q78S%sH!?1!{zNQS6q);Npsm;NYkj_(l+t71^hJpYp5XgIy|jDo=9N z(5q*xV^cV?s6N-!+QT@5N^hJ!74lxng-^#GcNIQ5y_8o+OP7+XZ=Gdy^Q|+<7;-G4 z-|Dw+-4uG__^riNE_uCI?mZ(apAI3LPdSp!ds4F6QHEd!#FcwJi#@r2@t3yNUvwUR z;xGBc6&3N9__h9`i?f{2Xo6FmkO0GW0uRNA5n-F;<>U8EYY;F97z7Lg1_6VBLBJqj z5cu;5c)MJ0Z!h~)*`3M Date: Fri, 18 Mar 2016 11:03:15 +0800 Subject: [PATCH 16/24] =?UTF-8?q?=E5=B0=86list=E7=B1=BB=E5=9E=8B=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E5=86=99=E5=88=B0xls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/0016/numbers.txt | 5 +++++ xyjxyf/0016/numbers.xls | Bin 0 -> 5632 bytes xyjxyf/show_me_the_code.py | 29 ++++++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 xyjxyf/0016/numbers.txt create mode 100644 xyjxyf/0016/numbers.xls diff --git a/xyjxyf/0016/numbers.txt b/xyjxyf/0016/numbers.txt new file mode 100644 index 00000000..c43c0378 --- /dev/null +++ b/xyjxyf/0016/numbers.txt @@ -0,0 +1,5 @@ +[ + [1, 82, 65535], + [20, 90, 13], + [26, 809, 1024] +] \ No newline at end of file diff --git a/xyjxyf/0016/numbers.xls b/xyjxyf/0016/numbers.xls new file mode 100644 index 0000000000000000000000000000000000000000..091d6ef7c70034eadcfe81c86a1f8e97e893660a GIT binary patch literal 5632 zcmeHLO=uHA6#jOTG>N2XHm0H#N+?*h_9B9KX}1bm5G=J9MFdT34z@Lws0Y1RtvL#U zC&f#l2wtLI{6Pi1c@Qdk5CkF7qbEVZLv{V$+eDHaLPV%P%v<)&+xOngoB7_%?C!i= za>@&Ldn#z6VFd8qi=v}WZ&8lco)e(m^W?EsMkrHd=pRBL8et+kLU`2qA}qO-d{I5xQH)a8u%;&5PF(6`jy4OLK^rgF@=2m!^}&w{;C}W=HMOG30_1ON&%@6 zM*hr+Y_4!>8M3GPw2FnlS`!VcwNqztjC_&}$c%P$E+<%b`PQdb`?BNi5!K99Ta&51 zK|;gB1*yTxaSfu;x$^@9T4Rgyi{gXzD)%T)ab0j__K$a0g+24?b4jiJjI&MYwY#xS z-bA_hasPwf;s&%1V6BRd?rIM9a^Mc%Rspsl{(?iZzvvuHD4$aQ?Ua3giQnumItNqA zZ^lHHj@THslei~Fj0mfeq_}dNA!tb}@{{T;~!3O{U literal 0 HcmV?d00001 diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 7c7c2809..ef4b5297 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -253,6 +253,7 @@ def replace_sensitive_words(sensitive_file=None, input_string=None): # 第 0013 题: 用 Python 写一个爬图片的程序 # 第 0014 题: 纯文本文件 student.txt为学生信息, 写到 student.xls 文件中 +# 第 0015 题: 纯文本文件 city.txt为城市信息,写到 city.xls 文件中 import json import xlwt @@ -292,7 +293,32 @@ def dictxt_to_xls(file_path=None): wb.save(save_path) -# 第 0015 题: 纯文本文件 city.txt为城市信息,写到 city.xls 文件中 +# 第 0016 题: 纯文本文件 numbers.txt, 请将上述内容写到 numbers.xls 文件中 +def listtxt_to_xls(file_path=None): + if file_path is None: + return + + file = open(file_path) + if file is None: + return + + content = json.loads(file.read()) + content.sort(key=lambda x:x[0]) + + (path, name)=os.path.split(file.name) + file_name = name.split('.')[0] + wb = xlwt.Workbook() + ws = wb.add_sheet(file_name) + + for i in range(len(content)): + col = 0 + list = content[i] + for value in list: + ws.write(i, col, content[i][col]) + col += 1 + + save_path = path + "/" + file_name + ".xls" + wb.save(save_path) if __name__ == "__main__": @@ -343,6 +369,7 @@ def dictxt_to_xls(file_path=None): # dictxt_to_xls("./0015/city.txt") # 0016 + listtxt_to_xls("./0016/numbers.txt") # 0017 From 1de49e64c31d6c2b4b2106941877854b8f9c6f38 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Tue, 22 Mar 2016 13:05:03 +0800 Subject: [PATCH 17/24] =?UTF-8?q?=20=E5=B0=86xls=E8=BD=AC=E4=B8=BAxml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/0017/student.xls | Bin 0 -> 5632 bytes xyjxyf/0017/student.xml | 14 ++++ xyjxyf/0018/city.xls | Bin 0 -> 5632 bytes xyjxyf/0018/city.xml | 13 ++++ xyjxyf/0019/numbers.xls | Bin 0 -> 5632 bytes xyjxyf/0019/numbers.xml | 13 ++++ xyjxyf/show_me_the_code.py | 128 ++++++++++++++++++++++++++++++++++++- xyjxyf/tools/stringer.py | 53 ++++++++++++++- 8 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 xyjxyf/0017/student.xls create mode 100644 xyjxyf/0017/student.xml create mode 100644 xyjxyf/0018/city.xls create mode 100644 xyjxyf/0018/city.xml create mode 100644 xyjxyf/0019/numbers.xls create mode 100644 xyjxyf/0019/numbers.xml diff --git a/xyjxyf/0017/student.xls b/xyjxyf/0017/student.xls new file mode 100644 index 0000000000000000000000000000000000000000..b80d5719531492f406e40788c7e799dad350887d GIT binary patch literal 5632 zcmeHLO=uHQ5dL<%Lh?Qs%n^ z6L&n%$bm)P2XP#UsZ2VyinK%fkTj$Z1LOv7QWL~_?NvniVdZO--&W7Z%7;{QQTYHO zC>oPa!0c38klet1ZSz(&eQ3jT`dDW!%VMY1i|yH?$;m&{(BWyuJUDN| z=}bDCoGc>B37p4QD+YX#0SG;fx%$<`!9Wc7COL&{{C%94YW-Ey1I)lWqzgQcRumef zg%8uY6RC72w}fupk+LhfAp5vpV`G5?#jO+*N8atD*iZ4o^tD72o$T!#s@Tpgy3Cu& zQ_LVsKCFv91V5H;eR{Qfd?Y@mni*<@7!(_&Z?JGyTCj0Y416gFd3pC}i!I8}i4QiY z+^#%IA8y^Qk+v0K*R1-SS8EsZ^eerNZz_{FQ_g?f^PnUDA>K`SVYqZEy6`4GhfcnD zQp_ROEP9PzC(T6z+O!8${~iG$gs@fBxk;US_`k?AR}w39&-K{ xitm1A&td}O+K-8PnpgPnqwi;a=|_dJR>l4rtmRR!?U(bHkH6j|HT-@n{|~kC%|ieH literal 0 HcmV?d00001 diff --git a/xyjxyf/0017/student.xml b/xyjxyf/0017/student.xml new file mode 100644 index 00000000..55abaffe --- /dev/null +++ b/xyjxyf/0017/student.xml @@ -0,0 +1,14 @@ + + + + + { + 3: ['王五', 60.0, 66.0, 68.0] + 2: ['李四', 90.0, 99.0, 95.0] + 1: ['张三', 150.0, 120.0, 100.0] + } + + diff --git a/xyjxyf/0018/city.xls b/xyjxyf/0018/city.xls new file mode 100644 index 0000000000000000000000000000000000000000..b020435b2949421ce0a19350dde0f784fe6daaf5 GIT binary patch literal 5632 zcmeHLO=uHQ5dLOy-M9N{ zJziXX&{;wa4WkL)-7uOf^cLl?-;aTI*Oji{hA2~I=pRBL9AY7xgLvAu)*`i(dY541 ze&7W;@PX$UTtIp@mrZRU9nu`eEy-bs+`?^YqS&cfC6rGn-=_SYdOlM=qMGZJC(*8Q zTxWU=A#B|F{Q78S%sH!?1!{zNQS6q);Npsm;NYkj_(l+t71^hJpYp5XgIy|jDo=9N z(5q*xV^cV?s6N-!+QT@5N^hJ!74lxng-^#GcNIQ5y_8o+OP7+XZ=Gdy^Q|+<7;-G4 z-|Dw+-4uG__^riNE_uCI?mZ(apAI3LPdSp!ds4F6QHEd!#FcwJi#@r2@t3yNUvwUR z;xGBc6&3N9__h9`i?f{2Xo6FmkO0GW0uRNA5n-F;<>U8EYY;F97z7Lg1_6VBLBJqj z5cu;5c)MJ0Z!h~)*`3M + + + { + 3: ['成都'] + 2: ['北京'] + 1: ['上海'] + } + + + diff --git a/xyjxyf/0019/numbers.xls b/xyjxyf/0019/numbers.xls new file mode 100644 index 0000000000000000000000000000000000000000..091d6ef7c70034eadcfe81c86a1f8e97e893660a GIT binary patch literal 5632 zcmeHLO=uHA6#jOTG>N2XHm0H#N+?*h_9B9KX}1bm5G=J9MFdT34z@Lws0Y1RtvL#U zC&f#l2wtLI{6Pi1c@Qdk5CkF7qbEVZLv{V$+eDHaLPV%P%v<)&+xOngoB7_%?C!i= za>@&Ldn#z6VFd8qi=v}WZ&8lco)e(m^W?EsMkrHd=pRBL8et+kLU`2qA}qO-d{I5xQH)a8u%;&5PF(6`jy4OLK^rgF@=2m!^}&w{;C}W=HMOG30_1ON&%@6 zM*hr+Y_4!>8M3GPw2FnlS`!VcwNqztjC_&}$c%P$E+<%b`PQdb`?BNi5!K99Ta&51 zK|;gB1*yTxaSfu;x$^@9T4Rgyi{gXzD)%T)ab0j__K$a0g+24?b4jiJjI&MYwY#xS z-bA_hasPwf;s&%1V6BRd?rIM9a^Mc%Rspsl{(?iZzvvuHD4$aQ?Ua3giQnumItNqA zZ^lHHj@THslei~Fj0mfeq_}dNA!tb}@{{T;~!3O{U literal 0 HcmV?d00001 diff --git a/xyjxyf/0019/numbers.xml b/xyjxyf/0019/numbers.xml new file mode 100644 index 00000000..8a6fcfd0 --- /dev/null +++ b/xyjxyf/0019/numbers.xml @@ -0,0 +1,13 @@ + + + + [ + [1.0, 82.0, 65535.0], + [20.0, 90.0, 13.0], + [26.0, 809.0, 1024.0], + ] + + + diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index ef4b5297..0d4bb1a3 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -320,6 +320,103 @@ def listtxt_to_xls(file_path=None): save_path = path + "/" + file_name + ".xls" wb.save(save_path) +# pip3 install xlrd +import xlrd +def read_xls(file_path=None): + if file_path is None: + return None + + data_list = {} + wb = xlrd.open_workbook(file_path) + sheet_names = wb.sheet_names() + for name in sheet_names: + table = wb.sheet_by_name(name) + table_data = [] + for i in range(table.nrows): + row_data = table.row_values(i) + table_data.append(row_data) + + data_list[name] = table_data + + return data_list + + +# 第 0017 题: 将 第 0014 题中的 student.xls 文件中的内容写到 student.xml 文件中 +# 使用DOM +from tools import stringer +from xml.dom.minidom import Document + +def write_student_to_xml(dic=None, to_path=None): + if dic is None or to_path is None: + return None + + doc = Document() + root_node = doc.createElement("root") + doc.appendChild(root_node) + + stu_node = doc.createElement("students") + root_node.appendChild(stu_node) + + note_node = doc.createComment("\n\t学生信息表\n\t\"id\" : [名字, 数学, 语文, 英文]\n\t") + stu_node.appendChild(note_node) + + # data = json.dumps(dic, ensure_ascii=False, indent=1) + dic_node = doc.createTextNode(stringer.dict_to_json(dic, "\t\t")) + stu_node.appendChild(dic_node) + + file = open(to_path, "w") + file.write(doc.toprettyxml()) + # doc.writexml(file,' ',' ','\n','utf-8') + file.close() + +# 第 0018 题: 将 第 0015 题中的 city.xls 文件中的内容写到 city.xml 文件中 +# 使用lxml +import codecs +from lxml import etree + +def write_city_to_xml(dic=None, to_path=None): + if dic is None or to_path is None: + return None + + root_node = etree.Element('root') + root_node.text = "\n\t" + + city_node = etree.SubElement(root_node, 'citys') + + comment_node = etree.Comment("\n城市信息\n") + comment_node.tail = "\n\t" + city_node.append(comment_node) + + city_node.text = "\n\t" + stringer.dict_to_json(dic, "\t") + u'\n' + city_node.tail = "\n" + + city_tree = etree.ElementTree(root_node) + city_tree.write(to_path, pretty_print=True, xml_declaration=True, encoding='utf-8') + # output = codecs.open(to_path, 'w', 'utf-8') + # output.write(etree.tounicode(city_tree.getroot())) + # output.close() + + +# 第 0019 题: 将 第 0016 题中的 numbers.xls 文件中的内容写到 numbers.xml 文件中 +def write_numbers_to_xml(list=None, to_path=None): + if list is None or to_path is None: + return None + + root_node = etree.Element('root') + root_node.text = "\n\t" + + number_node = etree.SubElement(root_node, 'numbers') + + comment_node = etree.Comment("\n数字信息\n") + comment_node.tail = "\n\t" + number_node.append(comment_node) + + number_node.text = "\n\t" + stringer.list_to_json(list, "\t") + u'\n' + number_node.tail = "\n" + + number_tree = etree.ElementTree(root_node) + number_tree.write(to_path, pretty_print=True, xml_declaration=True, encoding='utf-8') + if __name__ == "__main__": # 0000 @@ -369,13 +466,42 @@ def listtxt_to_xls(file_path=None): # dictxt_to_xls("./0015/city.txt") # 0016 - listtxt_to_xls("./0016/numbers.txt") + # listtxt_to_xls("./0016/numbers.txt") # 0017 + # student_dic = read_xls("./0017/student.xls") + # for key in student_dic: + # student = student_dic[key] + # + # dic = {} + # for list in student: + # dic[list[0]] = list[1:] + # + # write_student_to_xml(dic, "./0017/student.xml") + # + # break + # 0018 + # city_dic = read_xls("./0018/city.xls") + # for key in city_dic: + # city = city_dic[key] + # + # dic = {} + # for list in city: + # dic[list[0]] = list[1:] + # + # write_city_to_xml(dic, "./0018/city.xml") + # + # break # 0019 + number_dic = read_xls("./0019/numbers.xls") + for key in number_dic: + number = number_dic[key] + write_numbers_to_xml(number, "./0019/numbers.xml") + + break # 0020 diff --git a/xyjxyf/tools/stringer.py b/xyjxyf/tools/stringer.py index e8b7e168..546dce86 100644 --- a/xyjxyf/tools/stringer.py +++ b/xyjxyf/tools/stringer.py @@ -22,4 +22,55 @@ def rand_char(): # 随机字母或者数字 def rand_choice(): str = 'abcdefghigklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM1234567890' - return random.choice(str) \ No newline at end of file + return random.choice(str) + +# 将字典转为json格式 +def dict_to_json(object=None, begin_indent="", indent=u'\t', newl=u'\n'): + if object is None: + return None + + if type(object) is not dict: + return None + + ret_str = u'{' + newl + space = begin_indent + indent + for key in object: + ret_str = ret_str + space + key + ": " + item = object[key] + ret_str = ret_str + u'%s,' % str(item) + # if type(item) is list: + # list_to_json(item) + # elif type(item) is dict: + # dict_to_json(item) + # else: + # str + ret_str = ret_str + begin_indent + newl + + ret_str = ret_str + begin_indent + u'}' + + return ret_str + + +# 将数组转为json格式 +def list_to_json(object=None, begin_indent="", indent=u'\t', newl=u'\n'): + if object is None: + return None + + if type(object) is not list: + return None + + ret_str = u'[' + newl + space = begin_indent + indent + for item in object: + ret_str = ret_str + space + u'%s,' % str(item) + # if type(item) is list: + # list_to_json(item) + # elif type(item) is dict: + # dict_to_json(item) + # else: + # str + ret_str = ret_str + begin_indent + newl + + ret_str = ret_str + begin_indent + u']' + + return ret_str \ No newline at end of file From 564334aca2bf8cb916ed04b78c81d6461acba104 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Wed, 23 Mar 2016 20:28:17 +0800 Subject: [PATCH 18/24] =?UTF-8?q?0009=EF=BC=9A=E8=8E=B7=E5=8F=96html?= =?UTF-8?q?=E4=B8=AD=E6=89=80=E6=9C=89=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/show_me_the_code.py | 26 +++++++++++++++----------- xyjxyf/tools/dxhtmlparser.py | 23 +++++++++++++++++++++++ 2 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 xyjxyf/tools/dxhtmlparser.py diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 0d4bb1a3..c07384bc 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -192,19 +192,22 @@ def get_html_context(url=None): if url is None: return None -# 第 0009 题:一个HTML文件,找出里面的链接。 +# 第 0009 题:一个HTML文件,找出里面的链接 +# 查找, 用 HTMLParser from urllib import request +from tools import dxhtmlparser def get_html_links(url=None): if url is None: return None - url_list = [] - content = request.urlopen(url).read() - - match = re.findall("", content) + content = request.urlopen(url).read().decode("utf-8") + dxparser = dxhtmlparser.DXHTMLParser('a', 'href', url) + dxparser.feed(content) + links = dxparser.getrets() + return links # 第 0010 题:使用 Python 生成字母验证码图片 def create_verification_code(): @@ -447,6 +450,7 @@ def write_numbers_to_xml(list=None, to_path=None): # 0008 # 0009 + get_html_links("http://blog.bccn.net") # 0010 # create_verification_code() @@ -496,12 +500,12 @@ def write_numbers_to_xml(list=None, to_path=None): # break # 0019 - number_dic = read_xls("./0019/numbers.xls") - for key in number_dic: - number = number_dic[key] - write_numbers_to_xml(number, "./0019/numbers.xml") - - break + # number_dic = read_xls("./0019/numbers.xls") + # for key in number_dic: + # number = number_dic[key] + # write_numbers_to_xml(number, "./0019/numbers.xml") + # + # break # 0020 diff --git a/xyjxyf/tools/dxhtmlparser.py b/xyjxyf/tools/dxhtmlparser.py new file mode 100644 index 00000000..49853b6c --- /dev/null +++ b/xyjxyf/tools/dxhtmlparser.py @@ -0,0 +1,23 @@ +# encoding = utf-8 + +from html.parser import HTMLParser + + +class DXHTMLParser(HTMLParser): + def __init__(self, tag, tag_name, url): + HTMLParser.__init__(self) + self.tag = tag + self.tag_name = tag_name + self.url = url + self.rets = [] + + def handle_starttag(self, tag, attrs): + if tag == self.tag: + for name,value in attrs: + if name == self.tag_name: + if value.startswith("/") and len(self.url) > 0: + value = self.url + value + self.rets.append(value) + + def getrets(self): + return self.rets \ No newline at end of file From 0037e83f974ba0aafbb2a480ca68cc0ec326bd36 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Sat, 26 Mar 2016 08:17:57 +0800 Subject: [PATCH 19/24] =?UTF-8?q?0008=EF=BC=9A=E8=8E=B7=E5=8F=96html?= =?UTF-8?q?=E6=AD=A3=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/show_me_the_code.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index c07384bc..106da0e5 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -187,11 +187,27 @@ def lines_of_codes(dir_path=None): return code_num, note_num, blank_line_num -# 第 0008 题:一个HTML文件,找出里面的正文。 +# 第 0008 题:一个HTML文件,找出里面的正文 +# 使用 pip install beautifulsoup4 +from bs4 import BeautifulSoup + def get_html_context(url=None): if url is None: return None + content = request.urlopen(url).read().decode("utf-8") + soup = BeautifulSoup(content) + [script.extract() for script in soup.find_all('script')] + [style.extract() for style in soup.find_all('style')] + + soup.prettify() + reg = re.compile("<[^>]*>") + ret_content = reg.sub('', soup.prettify()) + # print(ret_content) + + return ret_content + + # 第 0009 题:一个HTML文件,找出里面的链接 # 查找, 用 HTMLParser from urllib import request @@ -448,9 +464,10 @@ def write_numbers_to_xml(list=None, to_path=None): # print("代码行数:%i\n注释行数:%i\n空行行数:%i" % (code, note, blank_line)) # 0008 + get_html_context("http://blog.bccn.net") # 0009 - get_html_links("http://blog.bccn.net") + # get_html_links("http://blog.bccn.net") # 0010 # create_verification_code() From da5aedaeda77ce53960633c29a986d1fdcdd9be4 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Sat, 26 Mar 2016 21:59:59 +0800 Subject: [PATCH 20/24] =?UTF-8?q?0013:=20=E7=88=AC=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/show_me_the_code.py | 13 +++++++- xyjxyf/tools/geturlimgs.py | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 xyjxyf/tools/geturlimgs.py diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 106da0e5..32128c25 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -270,6 +270,16 @@ def replace_sensitive_words(sensitive_file=None, input_string=None): print(input_string) # 第 0013 题: 用 Python 写一个爬图片的程序 +from tools import geturlimgs + +def get_url_imgs(url=None): + if url is None: + return None + + tmp = geturlimgs.geturlimgs() + tmp.get_imgs(url, "/Users/xieyajie/Desktop/Python/ShowMeCode/xyjxyf/0013/") + + # 第 0014 题: 纯文本文件 student.txt为学生信息, 写到 student.xls 文件中 # 第 0015 题: 纯文本文件 city.txt为城市信息,写到 city.xls 文件中 @@ -464,7 +474,7 @@ def write_numbers_to_xml(list=None, to_path=None): # print("代码行数:%i\n注释行数:%i\n空行行数:%i" % (code, note, blank_line)) # 0008 - get_html_context("http://blog.bccn.net") + # get_html_context("http://blog.bccn.net") # 0009 # get_html_links("http://blog.bccn.net") @@ -479,6 +489,7 @@ def write_numbers_to_xml(list=None, to_path=None): # replace_sensitive_words("./0011/0011.txt", "haha, 北京不错") # 0013 + get_url_imgs("http://www.ivsky.com/tupian/beijing_t1542/index_2.html") # 0014 # dictxt_to_xls("./0014/student.txt") diff --git a/xyjxyf/tools/geturlimgs.py b/xyjxyf/tools/geturlimgs.py new file mode 100644 index 00000000..359bb975 --- /dev/null +++ b/xyjxyf/tools/geturlimgs.py @@ -0,0 +1,66 @@ +# encoding = utf-8 + +import socket, os +from urllib import request +from bs4 import BeautifulSoup + +class geturlimgs(object): + + def __index__(self, to_dir=None): + self.to_dir = None + + # 伪装浏览器,以免被封 + def user_agent(self, url): + req_header = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} + req_timeout = 20 + try: + req = request.Request(url,None,req_header) + html = request.urlopen(req,None,req_timeout) + except request.URLError as e: + print(e.message) + except socket.timeout as e: + # user_agent(url) + print("timeout") + + return html + + def get_img_links(self, url=None): + if url is None or len(url) == 0: + return None + html = self.user_agent(url) + soup = BeautifulSoup(html, "lxml") + + count = 0 + links = [] + items = soup.find_all('img') + for item in items: + link = item.get('src') + links.append(link) + + return links + + def download_imgs(self, links, to_dir): + if links is None or len(links) == 0: + return + + if not os.path.exists(to_dir): + os.makedirs(to_dir) + + if not to_dir.endswith('/'): + to_dir = to_dir + '/' + + index = 0 + for url in links: + end = os.path.splitext(url)[1] + if len(end) == 0: + end = ".jpg" + img_path = to_dir + '%i%s' % (index, end) + image = request.urlretrieve(url, img_path) + index = index + 1 + + def get_imgs(self, url=None, to_dir=None): + if url is None or to_dir is None: + return None + + links = self.get_img_links(url) + return self.download_imgs(links, to_dir) From aa7e12be5c8fd951165f68d878030cc2e66f7c10 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Mon, 28 Mar 2016 10:28:59 +0800 Subject: [PATCH 21/24] update --- xyjxyf/{ => 0000}/0000.jpg | Bin xyjxyf/{ => 0004}/0004.txt | 0 xyjxyf/0020/src.xls | Bin 0 -> 44032 bytes xyjxyf/show_me_the_code.py | 4 ++-- 4 files changed, 2 insertions(+), 2 deletions(-) rename xyjxyf/{ => 0000}/0000.jpg (100%) rename xyjxyf/{ => 0004}/0004.txt (100%) create mode 100644 xyjxyf/0020/src.xls diff --git a/xyjxyf/0000.jpg b/xyjxyf/0000/0000.jpg similarity index 100% rename from xyjxyf/0000.jpg rename to xyjxyf/0000/0000.jpg diff --git a/xyjxyf/0004.txt b/xyjxyf/0004/0004.txt similarity index 100% rename from xyjxyf/0004.txt rename to xyjxyf/0004/0004.txt diff --git a/xyjxyf/0020/src.xls b/xyjxyf/0020/src.xls new file mode 100644 index 0000000000000000000000000000000000000000..3eb2fb39c0ab06558e8e89e5473507d9560282b0 GIT binary patch literal 44032 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 literal 0 HcmV?d00001 diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 32128c25..7a47f2d9 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -449,7 +449,7 @@ def write_numbers_to_xml(list=None, to_path=None): if __name__ == "__main__": # 0000 - # add_num("./0000.jpg") + # add_num(".0000/0000.jpg") # 0001 # create_activation_code() @@ -461,7 +461,7 @@ def write_numbers_to_xml(list=None, to_path=None): # save_activation_code_to_redis() # 0004 - # number_of_words("./0004.txt") + # number_of_words("./0004/0004.txt") # 0005 # reset_images_size("./0005") From 782e19d812108b58cb757797b27a72de8768f84e Mon Sep 17 00:00:00 2001 From: XieYajie Date: Mon, 28 Mar 2016 14:38:09 +0800 Subject: [PATCH 22/24] =?UTF-8?q?0020=EF=BC=9A=E6=8C=89=E6=9C=88=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E9=80=9A=E8=AF=9D=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/0020/0020.xls | Bin 0 -> 18432 bytes xyjxyf/0020/src.xls | Bin 44032 -> 0 bytes xyjxyf/show_me_the_code.py | 57 ++++++++++++++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 xyjxyf/0020/0020.xls delete mode 100644 xyjxyf/0020/src.xls diff --git a/xyjxyf/0020/0020.xls b/xyjxyf/0020/0020.xls new file mode 100644 index 0000000000000000000000000000000000000000..f0d493e5068d3a8d31b70ff95294612679d65c8d GIT binary patch literal 18432 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 HE9n0p_s=KT literal 0 HcmV?d00001 diff --git a/xyjxyf/0020/src.xls b/xyjxyf/0020/src.xls deleted file mode 100644 index 3eb2fb39c0ab06558e8e89e5473507d9560282b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44032 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 diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 7a47f2d9..8c81159c 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -447,6 +447,60 @@ def write_numbers_to_xml(list=None, to_path=None): number_tree.write(to_path, pretty_print=True, xml_declaration=True, encoding='utf-8') +# 第 0020 题: 登陆中国联通网上营业厅 后选择「自助服务」 --> 「详单查询」,然后选择你要查询的时间段,点击「查询」按钮, +# 查询结果页面的最下方,点击「导出」,就会生成类似于 2014年10月01日~2014年10月31日通话详单.xls 文件。 +# 写代码,对每月通话时间做个统计 + +import datetime + +def statistics_month_time(): + dic = {} + wb = xlrd.open_workbook("./0020/0020.xls") + sheet = wb.sheets()[0] + row_count = sheet.nrows + + for i in range(1, sheet.nrows): + values = sheet.row_values(i) + ym_str = values[2][:6] + + time_str = values[3] + if '时' in time_str: + time_str = re.sub('时', '.', time_str) + if '分' in time_str: + time_str = re.sub('分', '.', time_str) + if '秒' in time_str: + time_str = re.sub('秒', '', time_str) + + tmp = time_str.split('.') + j = len(tmp) - 1 + sum = int(tmp[j]) + while j > -1: + sum = sum + (len(tmp) - 1 - j) * 60 * int(tmp[j]) + j = j - 1 + + if ym_str in dic: + dic[ym_str] = dic[ym_str] + int(sum) + else: + dic[ym_str] = int(sum) + + # i = i + 1 + + return dic + + +# 第 0022 题: iPhone 6、iPhone 6 Plus 早已上市开卖。请查看你写得 第 0005 题的代码是否可以复用 + + +# 第 0023 题: 使用 Python 的 Web 框架,做一个 Web 版本 留言簿 应用 + + +# 第 0024 题: 使用 Python 的 Web 框架,做一个 Web 版本 TodoList 应用 + + +# 第 0025 题: 使用 Python 实现:对着电脑吼一声,自动打开浏览器中的默认网站 + + + if __name__ == "__main__": # 0000 # add_num(".0000/0000.jpg") @@ -489,7 +543,7 @@ def write_numbers_to_xml(list=None, to_path=None): # replace_sensitive_words("./0011/0011.txt", "haha, 北京不错") # 0013 - get_url_imgs("http://www.ivsky.com/tupian/beijing_t1542/index_2.html") + # get_url_imgs("http://www.ivsky.com/tupian/beijing_t1542/index_2.html") # 0014 # dictxt_to_xls("./0014/student.txt") @@ -536,6 +590,7 @@ def write_numbers_to_xml(list=None, to_path=None): # break # 0020 + statistics_month_time() # 0021 From 49c7aa46d105639e76bb358907444eb9ea7bb919 Mon Sep 17 00:00:00 2001 From: XieYajie Date: Tue, 29 Mar 2016 12:27:54 +0800 Subject: [PATCH 23/24] =?UTF-8?q?0021:=20=E7=BB=99=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/show_me_the_code.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 8c81159c..1cffa1c7 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -488,6 +488,24 @@ def statistics_month_time(): return dic +# 第 0021 题: 请使用 Python 对密码加密 +from hashlib import sha256 +from hmac import HMAC + +def encrypt_password(password, salt=None): + if salt is None: + salt = os.urandom(8) + + if isinstance(password, str): + password = password.encode('UTF-8') + + ret = password + for i in range(10): + ret = HMAC(ret, salt, sha256).digest() + + return salt + ret + + # 第 0022 题: iPhone 6、iPhone 6 Plus 早已上市开卖。请查看你写得 第 0005 题的代码是否可以复用 @@ -590,9 +608,10 @@ def statistics_month_time(): # break # 0020 - statistics_month_time() + # statistics_month_time() # 0021 + encrypt_password("123") # 0022 From 98bc77db9ca061da3596f8a5d45d85ce2f4865cc Mon Sep 17 00:00:00 2001 From: XieYajie Date: Fri, 15 Apr 2016 15:35:50 +0800 Subject: [PATCH 24/24] =?UTF-8?q?0025:=20=E8=AF=AD=E9=9F=B3=E6=89=93?= =?UTF-8?q?=E5=BC=80=E6=B5=8F=E8=A7=88=E5=99=A8=E6=90=9C=E7=B4=A2=E5=BC=95?= =?UTF-8?q?=E6=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyjxyf/0025/voice_open_browser.py | 78 ++++++++++++++++++++ xyjxyf/show_me_the_code.py | 2 +- xyjxyf/tools/dxbaiduaudio.py | 115 ++++++++++++++++++++++++++++++ 3 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 xyjxyf/0025/voice_open_browser.py create mode 100644 xyjxyf/tools/dxbaiduaudio.py diff --git a/xyjxyf/0025/voice_open_browser.py b/xyjxyf/0025/voice_open_browser.py new file mode 100644 index 00000000..f4127c29 --- /dev/null +++ b/xyjxyf/0025/voice_open_browser.py @@ -0,0 +1,78 @@ +# encoding = utf-8 + +# use pyAudio +# brew install portaudio +# pip install pyaudio + +import wave, pyaudio +from datetime import datetime +from tools import dxbaiduaudio +import webbrowser + +CHUNK = 1024 +FORMAT = pyaudio.paInt16 +RATE = 8000 +CHANNELS = 1 +RECORD_SECONDS = 5 + +def record_wave(to_dir=None): + if to_dir is None: + to_dir = "./" + + pa = pyaudio.PyAudio() + stream = pa.open(format = FORMAT, + channels = CHANNELS, + rate = RATE, + input = True, + frames_per_buffer = CHUNK) + + print("* recording") + + save_buffer = [] + for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): + audio_data = stream.read(CHUNK) + save_buffer.append(audio_data) + + print("* done recording") + + # stop + stream.stop_stream() + stream.close() + pa.terminate() + + # wav path + file_name = datetime.now().strftime("%Y-%m-%d_%H_%M_%S")+".wav" + if to_dir.endswith('/'): + file_path = to_dir + file_name + else: + file_path = to_dir + "/" + file_name + + # save file + wf = wave.open(file_path, 'wb') + wf.setnchannels(CHANNELS) + wf.setsampwidth(pa.get_sample_size(FORMAT)) + wf.setframerate(RATE) + # join 前的类型 + wf.writeframes(b''.join(save_buffer)) + wf.close() + + return file_path + +def browser_open_text(text): + if text is None: + return + + url = "http://www.baidu.com" + if text.startswith("谷歌") or text.startswith("google"): + url = "http://www.google.com" + elif text.startswith("必应") or text.startswith("bing"): + url = "http://cn.bing.com" + + webbrowser.open_new_tab(url) + +if __name__ == "__main__": + to_dir = "./" + file_path = record_wave(to_dir) + + text = dxbaiduaudio.wav_to_text(file_path) + browser_open_text(text) diff --git a/xyjxyf/show_me_the_code.py b/xyjxyf/show_me_the_code.py index 1cffa1c7..ff3a36d1 100644 --- a/xyjxyf/show_me_the_code.py +++ b/xyjxyf/show_me_the_code.py @@ -516,7 +516,7 @@ def encrypt_password(password, salt=None): # 第 0025 题: 使用 Python 实现:对着电脑吼一声,自动打开浏览器中的默认网站 - +# 在文件夹0025中实现 if __name__ == "__main__": diff --git a/xyjxyf/tools/dxbaiduaudio.py b/xyjxyf/tools/dxbaiduaudio.py new file mode 100644 index 00000000..0c8a7bf4 --- /dev/null +++ b/xyjxyf/tools/dxbaiduaudio.py @@ -0,0 +1,115 @@ +# encoing = utf-8 + +from urllib import request +import json, base64, uuid, os +import wave +import pycurl +import io + +bda_app_id = "7972313" +bda_api_key = "ZrjLfF5Rh7pOL66gaOmDGnXn" +bda_secret_key = "16bac9645093ca2632ebb81015ff7544" + +bda_access_token = "" +bda_expires_in = "" +ret_text = "" + +def get_mac_address(): + return uuid.UUID(int=uuid.getnode()).hex[-12:] + +def get_access_token(): + url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=ZrjLfF5Rh7pOL66gaOmDGnXn&client_secret=16bac9645093ca2632ebb81015ff7544" + + req = request.Request(url, method="POST") + resp = request.urlopen(req) + data = resp.read().decode('utf-8') + json_data = json.loads(data) + + global bda_access_token + bda_access_token = json_data['access_token'] + + return bda_access_token + +CHUNK = 1024 +def get_wav_data(wav_path): + if wav_path is None or len(wav_path) == 0: + return None + + fp = wave.open(wav_path, 'rb') + nf = fp.getnframes() + f_len = nf * 2 + audio_data = fp.readframes(nf) + + return audio_data, f_len + +def dump_res(buf): + resp_json = json.loads(buf.decode('utf-8')) + ret = resp_json['result'] + + global ret_text + ret_text = ret[0] + + print(buf) + +def wav_to_text(wav_path): + if wav_path is None or len(wav_path) == 0: + return None + + if len(bda_access_token) == 0: + get_access_token() + if len(bda_access_token) == 0: + return None + + data, f_len = get_wav_data(wav_path) + + url = 'http://vop.baidu.com/server_api?cuid=' + get_mac_address() + '&token=' + bda_access_token + http_header = [ + 'Content-Type: audio/pcm; rate=8000', + 'Content-Length: %d' % f_len + ] + + c = pycurl.Curl() + c.setopt(pycurl.URL, str(url)) #curl doesn't support unicode + #c.setopt(c.RETURNTRANSFER, 1) + c.setopt(c.HTTPHEADER, http_header) #must be list, not dict + c.setopt(c.POST, 1) + c.setopt(c.CONNECTTIMEOUT, 30) + c.setopt(c.TIMEOUT, 30) + c.setopt(c.WRITEFUNCTION, dump_res) + c.setopt(c.POSTFIELDS, data) + c.setopt(c.POSTFIELDSIZE, f_len) + c.perform() #pycurl.perform() has no return val + + return ret_text + + +# def wav_to_text(wav_path): +# if wav_path is None or len(wav_path) == 0: +# return None +# +# wav_data = get_wav_data(wav_path) +# if wav_data is None: +# return None +# +# if len(bda_access_token) == 0: +# get_access_token() +# +# wav_base64 = base64.b64decode(wav_data) +# print("%s", wav_base64) +# # unicode( wav_base64, errors='ignore') +# wav_len = len(wav_data) +# data_dic = {'format':'wav', 'rate':8000, 'channel':1, +# 'cuid':get_mac_address(), 'token':bda_access_token, +# b'speech':wav_base64, 'len':wav_len} +# json_data = json.dumps(data_dic).encode('utf-8') +# json_len = len(json_data) +# +# req = request.Request('http://vop.baidu.com/server_api') +# req.add_header('Content-Type', "application/json") +# req.add_header("Content-Length", json_len) +# resp = request.urlopen(req, data=json_data) +# +# resp_data = resp.read().decode('utf-8') +# resp_json = json.loads(resp_data) +# +# return resp_json['result'] \ No newline at end of file