一些牛逼的Python程序整理

2021-03-02 Python學習交流樂園
有網友在 Quora 上提問,「你用 Python 寫過最牛逼的程序/腳本是什麼?」。本文摘編了 3 個國外程式設計師的多個小項目,含代碼。

Manoj Memana Jayakumar, 3000+ 頂更新:憑藉這些腳本,我找到了工作!可看我在這個帖子中的回覆,《Has anyone got a job through Quora? Or somehow made lots of money through Quora?》1. 電影/電視劇 字幕一鍵下載器我們經常會遇到這樣的情景,就是打開字幕網站subscene 或者opensubtitles, 搜索電影或電視劇的名字,然後選擇正確的抓取器,下載字幕文件,解壓,剪切並粘貼到電影所在的文件夾,並且需把字幕文件重命名以匹配電影文件的名字。是不是覺得太無趣呢?對了,我之前寫了一個腳本,用來下載正確的電影或電視劇字幕文件,並且存儲到與電影文件所在位置。所有的操作步驟僅需一鍵就可以完成。懵逼了嗎?請看這個 Youtube 視頻:https://youtu.be/Q5YWEqgw9X8原始碼存放在GitHub:subtitle-downloader更新:目前,該腳本支持多個字幕文件同時下載。步驟:按住 Ctrl ,選擇你想要為其下載字幕的多個文件 , 最後執行腳本即可2. IMDb 查詢/電子表格生成器我是一個電影迷,喜歡看電影。我總是會為該看哪一部電影而困惑,因為我搜集了大量的電影。所以,我應該如何做才能消除這種困惑,選擇一部今晚看的電影?沒錯,就是IMDb。我打開 http://imdb.com,輸入電影的名字,看排名,閱讀和評論,找出一部值得看的電影。但是,我有太多電影了。誰會想要在搜索框輸入所有的電影的名字呢?我肯定不會這樣做,尤其是我相信「如果某些東西是重複性的,那麼它應該是可以自動化的」。因此,我寫了一個 python 腳本, 目的是為了使用 非官方的 IMDb API 來獲取數據。我選擇一個電影文件(文件夾),點擊右鍵,選擇『發送到』,然後 點擊 IMDB.cmd (順便提一下,IMDB.cmd 這個文件就是我寫的 python 腳本),就是這樣。我的瀏覽器會打開這部電影在IMDb網站上的準確頁面。僅僅只需點擊一個按鍵,就可以完成如上操作。如果你不能夠了解這個腳本到底有多酷,以及它可以為你節省多少時間,請看這個 Youtube 視頻:https://youtu.be/JANNcimQGyk從現在開始,你再也不需要打開你的瀏覽器,等待加載IMDb的頁面,鍵入電影的名字。這個腳本會幫你完成所有的操作。跟往常一樣,原始碼放在了GitHub:imdb ,並且附有操作說明。當然,由於這個腳本必須去掉文件或文件夾中的無意義的字符,比如「DVDRip, YIFY, BRrip」等,所以在運行腳本的時候會有一定比例的錯誤。但是經過測試,這個腳本在我幾乎所有的電影文件上都運行的很好。許多人在問我是否可以寫一個腳本,可以發現一個文件夾中所有電影的詳細信息,因為每一次只能發現一個電影的詳細信息是非常麻煩的。我已經更新了這個腳本,支持處理整個文件夾。腳本會分析這個文件夾裡的所有子文件夾,從 IMDb上抓取所有電影的詳細信息 ,然後打開一個電子表格,根據IMDb 上的排名,從高到低降序排列所有的電影。這個表格中包含了 (所有電影)在 IMDb URL, 年份,情節,分類,獲獎信息,演員信息,以及其他的你可能在 IMBb找到的信息。下面是腳本執行後,生成的表格範例:

Your very own personal IMDb database! What more can a movie buff ask for? ;)
Source on GitHub: imdb你也可以有一個個人 IMDb 資料庫!一個電影愛好者還能夠要求更多嗎?:)3. theoatmeal.com 連載漫畫下載器

我個人超級喜歡 Matthew Inman 的漫畫。它們在瘋狂搞笑的同時,卻又發人深省。但是,我很厭煩重複點擊下一個,然後才能閱讀每一個漫畫。另外,由於每一個漫畫都由多福圖片組成,所以手動下載這些漫畫是非常困難的。基於如上原因,我寫了一個 python 腳本 ,用來從這個站點下載所有的漫畫。這個腳本利用 BeautifulSoup (http://www.crummy.com/software/B… ) 解析 HTML 數據, 所以在運行腳本前,必須安裝 BeautifulSoup。用於下載燕麥片(馬修.英曼的一部漫畫作品)的下載器已經上傳到GitHub:theoatmeal.com-downloader  。(漫畫)下載完後的文件夾是這樣的 :D成功地從http://www.theoatmeal.com 下載了整部漫畫後,我在想是否我可以做同樣的事情 , 從另一個我喜歡的站點— 搞笑的,唯一的http://www.someecards.com . 下載一些東西呢?

somececards 的問題是,圖片命名是完全隨機的,所有圖片的排放沒有特定的順序,並且一共有52 個大的類別, 每一個類別都有數以千計的圖片。我知道,如果我的腳本是多線程的話,那將是非常完美的,因為有大量的數據需要解析和下載,因此我給每一個類別中的每一頁都分配一個線程。這個腳本會從網站的每一個單獨的分類下載搞笑的電子賀卡,並且把每一個放到單獨的文件夾。現在,我擁有這個星球上最好笑的電子賀卡私人收藏。下載完成後,我的文件夾是這樣的:沒錯,我的私人收藏總共包括:52個類別,5036個電子賀卡。原始碼在這裡:someecards.com-downloader 編輯:很多人問我是否可以共享我下載的所有文件,(在這裡,我要說)由於我的網絡不太穩定,我沒辦法把我的收藏上傳到網絡硬碟,但是我已經上傳一個種子文件,你們可以在這裡下載:somecards.com Site Rip torrentAkshit Khurana,4400+ 頂感謝 500 多個朋友在 Facebook 上為我送出的生日祝福有三個故事讓我的21歲生日變的難忘,這是最後一個故事。我傾向於在每一條祝福下親自評論,但是使用 python 來做更好。

1…
2
31.    # Thanking everyone who wished me on my birthday
4
52.    import requests
6
73.    import json
8
94.
10
115.    # Aman s post time
12
136.    AFTER = 1353233754
14
157.    TOKEN =   
16
178.
18
199.    def get_posts():
20
2110.        """Returns dictionary of id, first names of people who posted on my wall
22
2311.        between start and end time"""
24
2512.        query = ("SELECT post_id, actor_id, message FROM stream WHERE "
26
2713.                "filter_key =  others  AND source_id = me() AND "
28
2914.                "created_time > 1353233754 LIMIT 200")
30
3115.
32
3316.        payload = { q : query, access_token : TOKEN}
34
3517.        r = requests.get( https://graph.facebook.com/fql , params=payload)
36
3718.        result = json.loads(r.text)
38
3919.        return result[ data ]
40
4120.
42
4321.    def commentall(wallposts):
44
4522.        """Comments thank you on all posts"""
46
4723.        #TODO convert to batch request later
48
4924.        for wallpost in wallposts:
50
5125.
52
5326.            r = requests.get( https://graph.facebook.com/%s %
54
5527.                    wallpost[ actor_id ])
56
5728.            url = https://graph.facebook.com/%s/comments % wallpost[ post_id ]
58
5929.            user = json.loads(r.text)
60
6130.            message = Thanks %s :) % user[ first_name ]
62
6331.            payload = { access_token : TOKEN, message : message}
64
6532.            s = requests.post(url, data=payload)
66
6733.
68
6934.            print "Wall post %s done" % wallpost[ post_id ]
70
7135.
72
7336.    if __name__ == __main__ :
74
7537.        commentall(get_posts())
76
77…

為了能夠順利運行腳本,你需要從Graph API Explorer(需適當權限)獲得 token。本腳本假設特定時間戳之後的所有帖子都是生日祝福。儘管對評論功能做了一點改變,我仍然喜歡每一個帖子。當我的點讚數,評論數以及評論結構在 ticker(Facebook一項功能,朋友可以看到另一個朋友在做什麼,比如點讚,聽歌,看電影等) 中爆漲後,我的一個朋友很快發現此事必有蹊蹺。儘管這個不是我最滿意的腳本,但是它簡單,快捷,有趣。當我和 Sandesh Agrawal 在網絡實驗室討論時,有了寫這個腳本的想法。為此,Sandesh Agrawal 耽擱了實驗室作業,深表感謝。Tanmay Kulshrestha,3300+ 頂好了,在我失去這個項目之前(一個豬一樣的朋友格式化了我的硬碟,我的所有代碼都在那個硬碟上)或者說,在我忘記這些代碼之前,我決定來回答這個問題。整理照片當我對圖像處理感興趣之後,我一直致力於研究機器學習。我寫這個有趣的腳本,目的是為了分類圖片,很像 Facebook 做的那樣(當然這是一個不夠精確的算法)。我使用了 OpenCV 的人臉檢測算法,「haarcascade_frontalface_default.xml」,它可以從一張照片中檢測到人臉。

你可能已經察覺到這張照片的某些地方被錯誤地識別為人臉。我試圖通過修改一些參數(來修正這一問題),但還是某些地方被錯誤地識別為人臉,這是由相機的相對距離導致的。我會在下一階段解決這一問題(訓練步驟)。這個訓練算法需要一些訓練素材,每個人需要至少需要100-120個訓練素材(當然多多益善)。我太懶了,並沒有為每一個人挑選照片,並把它們複製粘帖到訓練文件夾。所以,你可能已經猜到,這個腳本會打開一個圖片,識別人臉,並顯示每一個人臉(腳本會根據處於當前節點的訓練素材給每一個人臉預測一個名字)。伴隨著每次你標記的照片,Recognizer 會被更新,並且還會包含上一次的訓練素材。在訓練過程中,你可以增加新的名字。我使用 python 庫 tkinter 做了一個 GUI。因此,大多數時候,你必須初始化一小部分照片(給照片中的人臉命名),其他的工作都可以交給訓練算法。因此,我訓練了 Recognizer ,然後讓它(Recognizer)去處理所有的圖片。我使用圖片中包含的人的人名來命名圖片,(例如:Tanmay&*****&*****)。因此,我可以遍歷整個文件夾,然後可以通過輸入人名的方法來搜索圖片。初始狀態下,當一個人臉還沒有訓練素材時(素材庫中還沒有包括這個人臉的名字),需要詢問他/她的名字。

最後一個是針對應對那些垃圾隨機方塊而使用的變通解決方案。

所以,現在尋找圖片變得相當簡單。順便提一下,很抱歉(我)放大了這些照片。

1import cv2
2
3import sys
4
5import os,random,string
6
7#choices=[ Add a name ]
8
9import os
10
11current_directory=os.path.dirname(os.path.abspath(__file__))
12
13from Tkinter import Tk
14
15from easygui import *
16
17import numpy as np
18
19x= os.listdir(current_directory)
20
21new_x=[]
22
23testing=[]
24
25for i in x:
26
27if i.find( . )==-1:
28
29new_x+=[i]
30
31else:
32
33testing+=[i]
34
35x=new_x
36
37g=x
38
39choices=[ Add a name ]+x
40
41y= range(1,len(x)+1)
42
43def get_images_and_labels():
44
45global current_directory,x,y,g
46
47if x==[]:
48
49return (False,False)
50
51image_paths=[]
52
53for i in g:
54
55path=current_directory+  +i
56
57for filename in os.listdir(path):
58
59final_path=path+  +filename
60
61image_paths+=[final_path]
62
63# images will contains face images
64
65images = []
66
67# labels will contains the label that is assigned to the image
68
69labels = []
70
71for image_path in image_paths:
72
73# Read the image and convert to grayscale
74
75img = cv2.imread(image_path,0)
76
77# Convert the image format into numpy array
78
79image = np.array(img, uint8 )
80
81# Get the label of the image
82
83backslash=image_path.rindex(  )
84
85underscore=image_path.index( _ ,backslash)
86
87nbr = image_path[backslash+1:underscore]
88
89t=g.index(nbr)
90
91nbr=y[t]
92
93# If face is detected, append the face to images and the label to labels
94
95images.append(image)
96
97labels.append(nbr)
98
99#cv2.imshow("Adding faces to traning set...", image)
100
101#cv2.waitKey(50)
102
103# return the images list and labels list
104
105return images, labels
106
107# Perform the tranining
108
109def train_recognizer():
110
111recognizer = cv2.createLBPHFaceRecognizer()
112
113images, labels = get_images_and_labels()
114
115if images==False:
116
117return False
118
119cv2.destroyAllWindows()
120
121recognizer.train(images, np.array(labels))
122
123return recognizer
124
125def get_name(image_path,recognizer):
126
127global x,choices
128
129#if recognizer==  :
130
131# recognizer=train_recognizer()
132
133cascadePath = "haarcascade_frontalface_default.xml"
134
135faceCascade = cv2.CascadeClassifier(cascadePath)
136
137#recognizer=train_recognizer()
138
139x1=testing
140
141global g
142
143print image_path
144
145image = cv2.imread(image_path)
146
147img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
148
149predict_image = np.array(img, uint8 )
150
151faces = faceCascade.detectMultiScale(
152
153img,
154
155scaleFactor=1.3,
156
157minNeighbors=5,
158
159minSize=(30, 30),
160
161flags = http://cv2.cv.CV_HAAR_SCALE_IMAGE
162
163)
164
165for (x, y, w, h) in faces:
166
167f= image[y:y+w,x:x+h]
168
169cv2.imwrite( temp.jpg ,f)
170
171im= temp.jpg
172
173nbr_predicted, conf = recognizer.predict(predict_image[y: y + h, x: x + w])
174
175predicted_name=g[nbr_predicted-1]
176
177print "{} is Correctly Recognized with confidence {}".format(predicted_name, conf)
178
179if conf>=140:
180
181continue
182
183msg= Is this  +predicted_name
184
185reply = buttonbox(msg, image=im, choices=[ Yes , No ])
186
187if reply== Yes :
188
189reply=predicted_name
190
191directory=current_directory+  +reply
192
193if not os.path.exists(directory):
194
195os.makedirs(directory)
196
197random_name=  .join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7))
198
199path=directory+  +random_name+ .jpg
200
201cv2.imwrite(path,f)
202
203else:
204
205msg = "Who is this?"
206
207reply = buttonbox(msg, image=im, choices=choices)
208
209if reply == Add a name :
210
211name=enterbox(msg= Enter the name , title= Training , strip=True)
212
213print name
214
215choices+=[name]
216
217reply=name
218
219directory=current_directory+  +reply
220
221if not os.path.exists(directory):
222
223os.makedirs(directory)
224
225random_name=  .join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7))
226
227path=directory+  +random_name+ .jpg
228
229print path
230
231cv2.imwrite(path,f)
232
233
234
235# calculate window position
236
237root = Tk()
238
239pos = int(root.winfo_screenwidth() * 0.5), int(root.winfo_screenheight() * 0.2)
240
241root.withdraw()
242
243WindowPosition = "+%d+%d" % pos
244
245
246
247# patch rootWindowPosition
248
249rootWindowPosition = WindowPosition
250
251def detect_faces(img):
252
253global choices,current_directory
254
255imagePath = img
256
257faceCascade = cv2.CascadeClassifier(cascPath)
258
259image = cv2.imread(imagePath)
260
261gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
262
263faces = faceCascade.detectMultiScale(
264
265gray,
266
267scaleFactor=1.3,
268
269minNeighbors=5,
270
271minSize=(30, 30),
272
273flags = http://cv2.cv.CV_HAAR_SCALE_IMAGE
274
275)
276
277
278
279print "Found {0} faces!".format(len(faces))
280
281m=0
282
283for (x, y, w, h) in faces:
284
285m+=1
286
287padding=0
288
289f= image[y-padding:y+w+padding,x-padding:x+h+padding]
290
291cv2.imwrite( temp.jpg ,f)
292
293im= temp.jpg
294
295msg = "Who is this?"
296
297reply = buttonbox(msg, image=im, choices=choices)
298
299if reply == Add a name :
300
301name=enterbox(msg= Enter the name , title= Training , strip=True)
302
303print name
304
305choices+=[name]
306
307reply=name
308
309directory=current_directory+  +reply
310
311if not os.path.exists(directory):
312
313os.makedirs(directory)
314
315random_name=  .join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7))
316
317path=directory+  +random_name+ .jpg
318
319print path
320
321cv2.imwrite(path,f)
322
323def new(img,recognizer):
324
325imagePath = current_directory+  +img
326
327print imagePath
328
329get_name(imagePath,recognizer)
330
331cascPath = haarcascade_frontalface_default.xml
332
333b=0
334
335os.system("change_name.py")
336
337for filename in os.listdir("."):
338
339b+=1
340
341if b%10==0 or b==1:
342
343os.system("change_name.py")
344
345recognizer=train_recognizer()
346
347if filename.endswith( .jpg ) or filename.endswith( .png ):
348
349print filename
350
351imagePath=filename
352
353#detect_faces(imagePath)
354
355new(imagePath,recognizer)
356
357os.remove(filename)
358
359raw_input( Done with this photograph )

我想進一步修改它的搜索功能,其中會包含更多的搜索類型,比如基於地理位置,微笑的臉,傷心的臉等等。(這樣我就可以在 Skylawns 上 搜索快樂的 Tanmay & 沮喪的 Akshay & 快樂的…)我還寫了很多腳本,但那都是很久之前的事情了,我也懶得再去檢查這些代碼了,我會列出部分代碼。GitHub 連結:tanmay2893/Image-SortingGmail 郵件通知在那段時間,我沒有智慧型手機。導致我常常錯過來自於我所在的研究所的郵件(在我的研究所的郵件 ID),我寫了一個腳本,可以在我的筆記本上運行,而且能給我的手機發信息。我使用 python 的 IMAP 庫來獲取郵件。我可以輸入一些重要的人的名字,這樣一來,當這些人給我發了郵件後,我可以收到簡訊通知。對於簡訊, 我使用了 way2sms.com(寫了一個 python 腳本,自動登陸我的帳戶,然後發送 簡訊)。PNR(Passenger Name Record旅客訂座記錄,下同) 狀態短訊鐵路方面不經常發送 PNR 狀態消息。因此,我寫了一個腳本,可以從印度鐵路網站獲取 PNR 狀態。這是非常容易的,因為那個網站沒有驗證碼,即使有,也只是形同虛設的驗證碼(在過去,一些字母會被寫在看起來像圖片一樣的東西上面,因為他們為這些字母使用了一個 「check」 的背景圖)。我們可以輕鬆地從 HTML 網頁得到這些字母。我不明白他們這樣做的目的是什麼,難道僅僅是為了愚弄他們自己嗎?不管怎麼樣,我使用簡訊息腳本來處理它,經過一段時間間隔,它會在我的筆記本上運行一次,就像是一個定時任務,只要 PNR 狀態有更新,它就會把更新信息發送給我。YouTube 視頻下載器這個腳本會從 Youtube 頁面下載所有的 Youtube 視頻 以及他們所有的字幕文件(從Download and save subtitles 下載)。為了使下載速度更快一點,我使用了多線程。還有一個功能是,即使你的電腦重啟了,仍然可以暫停和恢復播放下載的(視頻)。我原本想做一個UI的,但是我太懶了… 一旦我的下載任務完成,我就不去關心 UI 的事情了。板球比分通知器我猜想這個功能已經在別的地方提到過了。一個窗口通知器。(在右下角的通知區域,它會告訴你實時比分以及評論信息)。如果你願意的化,在某些時間段,你也可以關掉它。WhatsApp 消息這個並不太實用,我只是寫著玩玩。因為 Whatsapp 有網頁版,我使用 selenium 和 Python 下載我的所有聯繫人的顯示圖片,並且,一旦有人更新了他們的顯示圖片,我將會知道。(如何做到的?非常簡單,在設定好時間間隔後,我會一遍又一遍的不停下載所有的頭像信息,一旦照片的尺寸發生變化,我將會知道他/她更新了顯示圖片)。然後我會給他/她發一個信息,不錯的頭像。我僅僅使用了一次來測試它的可用性。Nalanda 下載器我們一般在這個叫 『Nalanda』 的網站上下載一些教學課件以及其他的課程資料, 『Nalanda』 在 BITS Pilani (Nalanda).  我自己懶得在考試前一天下載所有的課件,所以,我寫了這個這個下載器,它可以把每一門科的課件下載到相應的文件夾。

1import mechanize,os,urllib2,urllib,requests,getpass,time
2
3start_time = time.time()
4
5from bs4 import BeautifulSoup
6
7br=mechanize.Browser()
8
9br.open( https://nalanda.bits-pilani.ac.in/login/index.php )
10
11br.select_form(nr=0)
12
13
14
15name=  
16
17while name==  :
18
19    try:
20
21        print *******
22
23        username=raw_input( Enter Your Nalanda Username:  )
24
25        password=getpass.getpass( Password:  )
26
27        br.form[ username ]=username
28
29        br.form[ password ]=password
30
31        res=br.submit()
32
33        response=res.read()
34
35        soup=BeautifulSoup(response)
36
37        name=str(soup.find( div ,attrs={ class : logininfo }).a.string)[:-2]
38
39    except:
40
41        print Wrong Password
42
43f=open( details.txt , w )
44
45f.write(username+ n +password)
46
47f.close()
48
49print Welcome,  +name
50
51print All the files will be downloaded in your Drive C in a folder named "nalanda"
52
53#print soup.prettify()
54
55div=soup.find_all( div ,attrs={ class : box coursebox })
56
57
58l=len(div)
59
60a=[]
61
62for i in range(l):
63
64    d=div[i]
65
66    s=str(d.div.h2.a.string)
67
68    s=s[:s.find( ( )]
69
70    c=(s,str(d.div.h2.a[ href ]))
71
72    path= c:nalanda +c[0]
73
74    if not os.path.exists(path):
75
76        os.makedirs(path)
77
78    a+=[c]
79
80#print a
81
82overall=[]
83
84for i in range(l):
85
86    response=br.open(a[i][1])
87
88    page=response.read()
89
90    soup=BeautifulSoup(page)
91
92    li=soup.find_all( li ,attrs={ class : section main clearfix })
93
94    x=len(li)
95
96    t=[]
97
98    folder=a[i][0]
99
100    print Downloading  +folder+  files...
101
102    o=[]
103
104    for j in range(x):
105
106        g=li[j].ul
107
108        #print g
109
110        #raw_input(  )
111
112        if g!=None:
113
114            temp=http://g.li[ class ].split(   )
115
116            #raw_input(  )
117
118            if temp[1]== resource :
119
120                #print  yes
121
122                #print  ********************
123
124                o+=[j]
125
126                h=li[j].find( div ,attrs={ class : content })
127
128                s=str(h.h3.string)
129
130                path= c:nalanda +folder
131
132                if path[-1]==   :
133
134                    path=path[:-1]
135
136                path+=  +s
137
138                if not os.path.exists(path):
139
140                    os.makedirs(path)
141
142                f=g.find_all( li )
143
144                r=len(f)
145
146                z=[]
147
148                for e in range(r):
149
150                    p=f[e].div.div.a
151
152                    q=f[e].find( span ,attrs={ class : resourcelinkdetails }).contents
153
154                    link=str(p[ href ])
155
156                    text=str(p.find( span ).contents[0])
157
158                    typ=  
159
160                    if str(q[0]).find( word )!=-1:
161
162                        typ= .docx
163
164                    elif str(q[0]).find( JPEG )!=-1:
165
166                        typ= .jpg
167
168                    else:
169
170                        typ= .pdf
171
172                    if typ!= .docx :
173
174                        res=br.open(link)
175
176                        soup=BeautifulSoup(res.read())
177
178                        if typ== .jpg :
179
180                            di=soup.find( div ,attrs={ class : resourcecontent resourceimg })
181
182                            link=di.img[ src ]
183
184                        else:
185
186                            di=soup.find( div ,attrs={ class : resourcecontent resourcepdf })
187
188                            link=di.object[ data ]
189
190                    try:
191
192                        if not os.path.exists(path+  +text+typ):
193
194                            br.retrieve(link,path+  +text+typ)[0]
195
196                    except:
197
198                        print Connectivity Issues
199
200                    z+=[(link,text,typ)]
201
202                t+=[(s,z)]
203
204    if t==[]:
205
206        print No Documents in this subject
207
208    overall+=[o]
209
210    #raw_input( Press any button to resume )
211
212#print overall
213
214print Time Taken to Download:  +str(time.time()-start_time)+  seconds
215
216print Do you think you can download all files faster than this :P
217
218print Closing in 10 seconds
219
220time.sleep(10)

我自己的 DC++這個腳本並不是很有用,目前只有一些學生在用它, 況且,DC ++ 已經提供了一些很酷的功能。我原本可以優化我自己的版本,但是,由於我們已經有了DC ++,我並沒有這麼做,儘管我已經使用 nodeJS 和 python 寫了一個基礎版本。打開 DC++ , 進入一個中心站點,然後連接,我寫了一個 python 腳本來做這件事。腳本會在 PC上創建一個伺服器(可以通過修改 SimpleHTTPRequestHandler 來完成)。在伺服器端(使用了NodeJS),它會拿到 PC 的連接,共享給其他的用戶。

這個頁面顯示了所有的用戶和他們的連結。因為我給 Nick 加了一個超連結,所以在連結這一攔是空的。所以,當用戶數量增加以後,這個頁面會列出所有的用戶列表。基本上,這個頁面充當了一個你和另外一個人聯繫的中間人角色。我還做了一個在所有用戶中搜索特定文件的功能。這裡是客戶端的 python 文件(這是一段很長的代碼,我上傳到了 Ideone)

相關焦點

  • 你用 Python 寫過哪些牛逼的程序/腳本?
    有網友在 Quora 上提問,「你用 Python 寫過最牛逼的程序/腳本是什麼?」。本文摘編了 3 個國外程式設計師的多個小項目,含代碼。
  • 5個無聊Python程序,用Python整蠱你的朋友們吧
    來源:https://dream.blog.csdn.net/Python 能做很多無聊,但有意思的事情,例如接下來的一些案例
  • 你用 Python 寫過最牛逼的程序是什麼?
    有網友在 Quora 上提問,「你用 Python 寫過最牛逼的程序/腳本是什麼?」。因此,我寫了一個 python 腳本, 目的是為了使用 非官方的 IMDb API 來獲取數據。我選擇一個電影文件(文件夾),點擊右鍵,選擇『發送到』,然後 點擊 IMDB.cmd (順便提一下,IMDB.cmd 這個文件就是我寫的 python 腳本),就是這樣。
  • 這些用 Python 寫的牛逼程序/腳本,你玩過嗎?
    /85986/有網友在 Quora 上提問,「你用 Python 寫過最牛逼的程序/腳本是什麼?」。因此,我寫了一個 python 腳本, 目的是為了使用 非官方的 IMDb API 來獲取數據。我選擇一個電影文件(文件夾),點擊右鍵,選擇『發送到』,然後 點擊 IMDB.cmd (順便提一下,IMDB.cmd 這個文件就是我寫的 python 腳本),就是這樣。
  • 使用Python製作表白小程序
    相信很多人在抖音,皮皮搞笑等小視頻中看過各種各樣的表白小程序。看完之後也是大呼神奇。對於正在學習python的小編來說,更讓我感興趣的還是小程序背後的代碼了。看完之後我就在想,作為萬能的python來說,實現這種功能應該不在話下吧。果不其然,在知乎上看到過一篇文章就是用python來實現一個表白程序。看完之後,小編就驚呆了,原來用python可以這麼簡單的實現這個程序。
  • Python如何打包成可執行程序exe
    Python是一種腳本語言,在開發完程序後,都要用python yourprogram.py來執行程序,這對於熟悉Windows作業系統的人來說,這時不可接受的,尤其是當用類似PyQt做出圖形界面時,如果還需要cmd時,簡直會有不再學習Python的衝動。
  • 幾個整蠱的Python程序 自己娛樂就好 勿做其它用途
    以下程序,不要發代碼,要不實現不了你整蠱的目的。要打包成一個 exe 程序,發給朋友才有意思。使用 pip install pyinstaller。​無聊程序之四這個程序就動感多了,會隨機出現彈窗。
  • 辣些有趣的python小程序
    一位匿名知乎網友爆料用Python寫了自動化交易程序瞬間感覺除了生孩紙,python都能做厲害了我的python ≖‿≖✧
  • Perl還是Python或者R
    如果你精通python,我相信你一周之內肯定能精通perl語言。假如我們把文本處理比作語文,科學計算比喻成數學,數據可視化比喻成繪畫三門學科。生物大數據大多以文本模式存儲,而且同樣屬於非結構化數據,所以,perl自然被大量用在生物數據處理中,有很多生物軟體就是用perl語言寫的,例如rnamer,nucmer等,很多生物軟體安裝包中提供一些附加小工具也是用perl寫的。另外,Perl根植於Linux shell,可以與shell進行很好的配合,比shell編程要更強大,可以替代shell完成很多自動化和批量化的操作。
  • Python開發:Win10創建定時任務執行Python腳本
    :  Win10創建定時任務  電腦桌面→我的電腦→右鍵→管理  計算機管理→系統工具→任務計劃程序→創建基本任務    選擇任務計劃程序    註:創建基礎任務時,選擇的執行程序是pythonw.exe,而不是python.exe,主要原因是pythonw.exe執行python程序是不會出現黑色控制臺窗口,python.exe
  • python能做什麼
    python能做什麼?書聲琅琅Python培訓老師介紹,最近許多的朋友諮詢,聽說python很火,甚至可以超越JAVA,因此很想學這個python,但是不知道python能做什麼,能完成一些什麼項目呢?針對這個問題,今天徐老師跟大家來聊一聊python能做什麼的話題。
  • Python到底是個啥?為什麼這麼多人都要學?
    Python是一種跨平臺的電腦程式設計語言,一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本,具有豐富和強大的庫,Python語言的核心只包含數字、字符串、列表、字典、文件等常見類型和函數,它常被暱稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕鬆地聯結在一起。
  • 利用Python開發App實戰
    最近想到嘗試用python開發一款app,google搜索了一番後,發現確實有路可尋,目前也有了一些相對成熟的模塊,於是便開始了動手實戰,過程中發現這其中有很多坑,好在最終依靠google解決了,因此小記一番。
  • 單片機上運行Python-MicroPython(三)
    在一個複雜且長期運行的程序中,堆棧因此會變得碎片化:儘管仍然有大量RAM空間可用,但沒有充足的連續的空間可用於新對象實例化使用。此時程序便會陷入到內存錯誤之中。上面章節所述的編程技巧均旨在減少內存碎片的產生。如果需要使用大的永久性緩衝或其它類型對象,最好在程序運行的早期就進行實例化,以避免內存碎片的影響。若要更進一步改善這種情況,可以監視堆棧的狀態並手動控制垃圾回收器的執行。
  • Python騷操作-自動搶火車票
    如果沒有買到的話,不妨試用下本文的 Python 程序來幫你搶火車票,也可以幫你的家人和朋友來搶票,順帶學習一下 Python 爬蟲技術,可謂一舉兩得,何樂而不為?我本來想自己寫一個練練手的,但是轉眼一想,Python 本身最大的優勢是什麼,不就是有很多牛逼的人已經造好輪子了嗎?你只需要知道這些輪子並會使用就行了,這樣會節省你大量的精力和時間,而且站在巨人的肩膀上,會看得更遠。
  • 利用python做串口通訊上位機
    安裝python開發環境首先到python官網https://www.python.org/downloads/windows/下載python軟體。如下圖所示,最新版本為3.8.2.    這就是python最大的優點:簡約而不簡單!
  • 無編程基礎,無計算機基礎都能看懂的零基礎入門Python
    速度慢,Python 的運行速度相比C語言確實慢很多,跟JAVA相比也要慢一些,因此這也是很多所謂的大牛不屑於使用Python的主要原因,但其實這裡所指的運行速度慢在大多數情況下用戶是無法直接感知到的,必須藉助測試工具才能體現出來,比如你用C運一個程序花了0.01s,用Python是0.1s,這樣C語言直接比Python快了10倍,算是非常誇張了,但是你是無法直接通過肉眼感知的,因為一個正常人所能感知的時間最小單位是
  • python與c語言的語法有哪些不一樣的
    在眾多程式語言之中,想必很多人都聽說過Python和C語言,在進行編程學習之前,大家都會問:python和c語言的區別有哪些?我該如何選擇?接下來我們來看看吧。python與C的區別如下:1、語言類型:Python是一種基於解釋器的語言,會逐行讀取代碼,將Python編譯為字節碼,由大型C程序解釋;C是一種編譯語言,完整的原始碼將直接編譯為機器代碼,由CPU直接執行。
  • 序列比對在biopython中的處理
    在biopython中,支持對序列比對的結果進行讀寫,解析,以及運行序列比對的程序。 首先來看下多序列比對,多序列比對的軟體較多,比如clustalw, muscle, mafft等,輸出結果的格式也很多,比如clustal, fasta, phylip等。
  • 文職美女上班手動用Excel表格太麻煩,當學會python後easy操作
    通過程序操作excel表格是編程中比較常見的操作,python本身不能直接操作excel,需要安裝第三方的模塊來實現excel的操作。三、創建一個excel表3.1 創建一個sheet表生成Workbook對象並向其添加一個表見下例:3.2 向剛添加的sheet1表寫入內容程序運行完