分类 Python 下的文章

接上文,从阿里云下载整个目录的文件,文件有25w,总量约90G,文件数目多且总体积大。
将这些文件转移到不同的文件夹中,然后针对单个文件夹进行查看、压缩等会变得方便。
下面的例子是将文件按照文件的文件名的前三位将文件进行划分,创建对应的文件夹,然后将文件移动到文件夹中。
如果你有其他划分规则,按规则来即可。


import os
import shutil


src_folder = '/data/source'

folder = "/data/dest"

count = 0
for filename in os.listdir(src_folder):
  prefix = filename[:3]

  if not os.path.exists(folder+prefix):
    os.makedirs(folder+prefix)

  dst = os.path.join(folder+prefix, filename)

  shutil.move(os.path.join(src_folder, filename), dst)
  count = count + 1
  print(count)

首先,先安装里云oss的lib:

pip install -i http://mirrors.aliyun.com/pypi/simple/ oss2

脚本如下:


import oss2
from itertools import islice
import shutil

accessKeyId = "access_key_id"
accessKeySecret = "access_key_secret"

auth = oss2.Auth(accessKeyId, accessKeySecret)

# auth = oss2.Auth(accessKeyId, accessKeySecret)
bucket = oss2.Bucket(auth, "https://your.endpoint.com/", "your bucket name")

count = 0
for obj in oss2.ObjectIterator(bucket, prefix = "your/path"):
    print(obj.key)
    count = count + 1
    # if count > 100:
    #     break
    print(count)
    object_stream = bucket.get_object(obj.key)
    with open("/data/"+obj.key, 'wb') as local_file_obj:
        shutil.copyfileobj(object_stream, local_file_obj)

print("====")
print(count)

3月10号晚上,我在v2ex上看到了这篇帖子 《JetBrains Quest,解开可获得全家桶三个月免费订阅》 https://www.v2ex.com/t/651662,当时准备已经洗完澡,准备休息了,看到这个,勾起了我的兴趣,虽然我用的是Community的版本……

No.0

首先看第一步,给出了一串文本,如下:

48 61 76 65 20 79 6f 75 20 73 65 65 6e 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 4a 65 74 42 72 61 69 6e 73 20 77 65 62 73 69 74 65 3f

从这个文本来看,应该是16进制的文本, 直接将这个16进制转换成文本试下:

x = '4861766520796f75207365656e2074686520736f7572636520636f6465206f6620746865204a6574427261696e7320776562736974653f'
print(bytes.fromhex(x).decode('utf-8'))

果然,结果是:

Have you seen the source code of the JetBrains website?

那就去JetBrains的官网看看

- 阅读剩余部分 -

3月11日,今天晚上到家,发现v2ex上又有人发出来JetBrains的第二道解谜了,就又参与了。

谜题是在JetBrains的twitter发布的:

Time for the next #JetBrainsQuest!
.spleh A+lrtC/dmC .thgis fo tuo si ti semitemos ,etihw si txet nehw sa drah kooL .tseretni wohs dluohs uoy ecalp a si ,dessecorp si xat hctuD erehw esac ehT .sedih tseuq fo txen eht erehw si ,deificeps era segaugnal cificeps-niamod tcudorp ehT

No.1

这段文字一看就像倒过来的,使用python进行reverse处理:

print(".spleh A+lrtC/dmC .thgis fo tuo si ti semitemos ,etihw si txet nehw sa drah kooL .tseretni wohs dluohs uoy ecalp a si ,dessecorp si xat hctuD erehw esac ehT .sedih tseuq fo txen eht erehw si ,deificeps era segaugnal cificeps-niamod tcudorp ehT"[::-1])

得到结果:

The product domain-specific languages are specified, is where the next of quest hides. The case where Dutch tax is processed, is a place you should show interest. Look hard as when text is white, sometimes it is out of sight. Cmd/Ctrl+A helps.

No.2

下一个谜题藏身于JetBrains的一款DSL工具中,参加过第一个谜题的话,应该会注意到,上次谜题中的MPS就是这个工具。打开MSP的网址:https://www.jetbrains.com/mps/

找到有关“Dutch tax”的地方,这个是一个case study,叫做“Agile Law Execution Factory”,介绍是“Domain-specific languages to implement Dutch tax legislation and process changes of that legislation.”,点击下面的“Read MPS case study”,是一个pdf文件,地址是:https://resources.jetbrains.com/storage/products/mps/docs/MPSQuest_DTO_Case_Study.pdf

下载好这个pdf文件,然后我使用chrome打开,乍一看下去,没有任何线索。但是上面的提示中,说到有些文本是白色的,使用Ctrl+A进行帮助,我就Ctrl+A然后Ctrl+C,再Ctrl+V到vscode中,发现有下面这一段话:

This is our 20th year as a company,
we have shared numbers in our JetBrains
Annual report, sharing the section with
18,650 numbers will progress your quest.

其实,这段话就位于第一页首部右侧的空白区域内。

- 阅读剩余部分 -

今天下午上数据库应用的课程,在路上就突然冒出这么一个想法。

交作业~~~

好几门课都有作业要交,大部分都是电子版的,特别是一些论文或报告,都是以word或pdf格式交的,发QQ或邮件,命名都有学号和姓名。

课代表收作业的时候都要检查一下,谁没有交,催一下,或者告诉老师~

当然,我们这一个小班也才50多个人,大班也才100号人,检查谁没有交作业可能花不了多少功夫。

然而,对于整个学院,或者带了很多班的老师,检查起来确实是一件很费力的功夫。

如果交大的作业形如:13091xxx_XXX,那么按文件名排序,可能还要好找些。不过就有几个特别的同学是这么交的:XXX_13091xxx,这个就尴尬了。

可以帮他们改名字,不过这估计是另一份工作了,和我今天要讨论的话题不符,我们要找到是谁没有交作业,而不是帮那些有个性的同学改名字。

我想了下,于是写了一个python,来做这份工作。

当然,大家可能对我的成品有兴趣,特别是课代表或什么的(自恋一下),不过,大部分同学可能并不是课代表,他们就对我是如何做的这个过程比较感兴趣。

  • 首先,思考一下环境。那些收上来的文件是放在一个文件夹里的(可能怪异的课代表会采用其他的方法,比如按男女或者其他什么的)
  • 然后,咱们要对这些文件的文件名进行分析,就要取得这些文件名
  • 最后对这些文件名进行分析,取出咱们关心的学号,然后进行比对,看看有哪些同学没有交作业

Ok,这个就是大概的步骤。看我的源码

#3.py 
#encoding:utf8 
import os 
import re

directory=raw_input("Please enter directory to traversal:") 
s=range(13091250,13091260)#大家的学号,是全部的哟,一个也不能少,13091250-13091259 
for root,dirs,files in os.walk(directory):#遍历目录下的所有文件 
   print root 
    for name in files:#取得文件名称,进行分析 
        n=re.findall(r’[w+]*(d{8})[w+]*’,name)#正则表达式找出那8个连在一起数字,即学号 
        if n:#找出学号,如果没有的话,那这位童鞋要么学号不是8位,要么他是采用了什么加密手段 
            m=int(n[0])#对取出的学号进行类型转换,变为int 
            if m in s:#查看该同学的学号在不在那一个大列表里 
                s.remove(m)#在的话,删掉,那么剩下的就是没有交作业的 
print s#OVER,看看是哪些同学没有交作业

看下的的测试文件,我只选取13091250-13091259 的进行测试:

这些文件位于E:name

wholostpaper

这些文件,极尽那些同学的想法吧

看看我的结果,是哪些同学没有交作业呢?

哦,是257和259啊,那课代表可以去找他们啦~

大家可以拿其他语言实现以下,比如java,C#,C/C++ ~