一行Python代码搞定局域网内文件共享与传输

前提:环境中有Python安装,并配置环境变量。

1、共享目录:Windows下,在要共享文件目录下,shift+鼠标右键,在此处打开命令行窗口(CMD);
2、服务开启python3 -m http.server 9527 #后面是端口号,端口号随意; python2 中可以使用 python -m SimpleHTTPServer 9527
3、访问Web: 共享机IP+port ,如 http://10.81.112.41:9527

Linux环境下可直接执行的share脚本:

[root@bdpdb02 parcels]$ cat share.sh
#!/usr/bin/env bash ip=$(ifconfig bond0 | egrep -o "inet addr:[^ ]*" | grep -o "[0-9.]*")if [ $# = 0 ]  # $#判断参数个数,$0脚本名字,$1 、 $2 、 $3执行脚本时输入的参数thenecho "Url:http://$ip:9527/"python3 -m http.server 9527else echo "Url:http://$ip:$1/"python3 -m http.server $1
fi

执行脚本:

[root@bdpdb02 parcels]$ [nohup] ./share.sh [> /dev/null 2>errorlog] [&]

上述http传输服务只能访问和下载开启服务共享的文件,不能上传文件到服务端,所以可以使用下面Python脚本实现Upload。(SimpleHTTPServerWithUpload.py)

SimpleHTTPServerWithUpload

Python36>python SimpleHTTPServerWithUpload.py --bind ip port
Eg:Python36>python SimpleHTTPServerWithUpload.py --bind 10.81.112.41 8000

#!/usr/bin/env python3"""Simple HTTP Server With Upload.
This module builds on http.server by implementing the standard GET
and HEAD requests in a fairly straightforward manner.
"""__version__ = "V0.0.1"
__all__ = ["SimpleHTTPRequestHandler"]
__home_page__ = "https://github.com/Qichen-Kylin/SimpleHTTPServerWithUpload"import os
import posixpath
import http.server
import socketserver
import urllib.request, urllib.parse, urllib.error
import html
import shutil
import mimetypes
import re
import argparse
import base64from io import BytesIOclass SimpleHTTPRequestHandler(http.server.BaseHTTPRequestHandler):"""Simple HTTP request handler with GET/HEAD/POST commands.This serves files from the current directory and any of itssubdirectories.  The MIME type for files is determined bycalling the .guess_type() method. And can reveive file uploadedby client.The GET/HEAD/POST requests are identical except that the HEADrequest omits the actual contents of the file."""server_version = "SimpleHTTPWithUpload/" + __version__def do_GET(self):"""Serve a GET request."""f = self.send_head()if f:self.copyfile(f, self.wfile)f.close()def do_HEAD(self):"""Serve a HEAD request."""f = self.send_head()if f:f.close()def do_POST(self):"""Serve a POST request."""r, info = self.deal_post_data()print((r, info, "by: ", self.client_address))f = BytesIO()f.write(b'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">')f.write(b"<html>\n<title>Upload Result Page</title>\n")f.write(b"<body>\n<h2>Upload Result Page</h2>\n")f.write(b"<hr>\n")if r:f.write(b"<strong>Success:</strong>")else:f.write(b"<strong>Failed:</strong>")f.write(info.encode())f.write(("<br><a href=\"%s\">back</a>" % self.headers['referer']).encode())f.write(b"<hr><small>Powered By: bones7456, check new version at ")f.write(b"<a href=\"https://gist.github.com/UniIsland/3346170\">")f.write(b"here</a>.</small></body>\n</html>\n")length = f.tell()f.seek(0)self.send_response(200)self.send_header("Content-type", "text/html")self.send_header("Content-Length", str(length))self.end_headers()if f:self.copyfile(f, self.wfile)f.close()def deal_post_data(self):uploaded_files = []content_type = self.headers['content-type']if not content_type:return (False, "Content-Type header doesn't contain boundary")boundary = content_type.split("=")[1].encode()remainbytes = int(self.headers['content-length'])line = self.rfile.readline()remainbytes -= len(line)if not boundary in line:return (False, "Content NOT begin with boundary")while remainbytes > 0:line = self.rfile.readline()remainbytes -= len(line)fn = re.findall(r'Content-Disposition.*name="file"; filename="(.*)"', line.decode())if not fn:return (False, "Can't find out file name...")path = self.translate_path(self.path)fn = os.path.join(path, fn[0])line = self.rfile.readline()remainbytes -= len(line)line = self.rfile.readline()remainbytes -= len(line)try:out = open(fn, 'wb')except IOError:return (False, "Can't create file to write, do you have permission to write?")else:with out:                    preline = self.rfile.readline()remainbytes -= len(preline)while remainbytes > 0:line = self.rfile.readline()remainbytes -= len(line)if boundary in line:preline = preline[0:-1]if preline.endswith(b'\r'):preline = preline[0:-1]out.write(preline)uploaded_files.append(fn)breakelse:out.write(preline)preline = linereturn (True, "File '%s' upload success!" % ",".join(uploaded_files))def send_head(self):"""Common code for GET and HEAD commands.This sends the response code and MIME headers.Return value is either a file object (which has to be copiedto the outputfile by the caller unless the command was HEAD,and must be closed by the caller under all circumstances), orNone, in which case the caller has nothing further to do."""path = self.translate_path(self.path)f = Noneif os.path.isdir(path):if not self.path.endswith('/'):# redirect browser - doing basically what apache doesself.send_response(301)self.send_header("Location", self.path + "/")self.end_headers()return Nonefor index in "index.html", "index.htm":index = os.path.join(path, index)if os.path.exists(index):path = indexbreakelse:return self.list_directory(path)ctype = self.guess_type(path)try:# Always read in binary mode. Opening files in text mode may cause# newline translations, making the actual size of the content# transmitted *less* than the content-length!f = open(path, 'rb')except IOError:self.send_error(404, "File not found")return Noneself.send_response(200)self.send_header("Content-type", ctype)fs = os.fstat(f.fileno())self.send_header("Content-Length", str(fs[6]))self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))self.end_headers()return fdef list_directory(self, path):"""Helper to produce a directory listing (absent index.html).Return value is either a file object, or None (indicating anerror).  In either case, the headers are sent, making theinterface the same as for send_head()."""try:list = os.listdir(path)except os.error:self.send_error(404, "No permission to list directory")return Nonelist.sort(key=lambda a: a.lower())f = BytesIO()displaypath = html.escape(urllib.parse.unquote(self.path))f.write(b'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">')f.write(("<html>\n<title>Directory listing for %s</title>\n" % displaypath).encode())f.write(b'<style type="text/css">\n')f.write(b'a { text-decoration: none; }\n')f.write(b'a:link { text-decoration: none; font-weight: bold; color: #0000ff; }\n')f.write(b'a:visited { text-decoration: none; font-weight: bold; color: #0000ff; }\n')f.write(b'a:active { text-decoration: none; font-weight: bold; color: #0000ff; }\n')f.write(b'a:hover { text-decoration: none; font-weight: bold; color: #ff0000; }\n')f.write(b'</style>\n')f.write(("<body>\n<h2>Directory listing for %s</h2>\n" % displaypath).encode())f.write(b"<hr>\n")f.write(b"<form ENCTYPE=\"multipart/form-data\" method=\"post\">")f.write(b"<input name=\"file\" type=\"file\" multiple/>")f.write(b"<input type=\"submit\" value=\"upload\"/></form>\n")f.write(b"<hr>\n")f.write(b'<a href="../"><img src="https://img-blog.csdnimg.cn/2022010704191246149.gif" alt="[PARENTDIR]" width="24" height="24">&nbsp;&nbsp;&nbsp;Parent Directory</a><br />\n')for name in list:dirimage = 'data:image/gif;base64,R0lGODlhGAAYAMIAAP///7+/v7u7u1ZWVTc3NwAAAAAAAAAAACH+RFRoaXMgaWNvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gMTk5NSBLZXZpbiBIdWdoZXMsIGtldmluaEBlaXQuY29tACH5BAEAAAEALAAAAAAYABgAAANdGLrc/jAuQaulQwYBuv9cFnFfSYoPWXoq2qgrALsTYN+4QOg6veFAG2FIdMCCNgvBiAxWlq8mUseUBqGMoxWArW1xXYXWGv59b+WxNH1GV9vsNvd9jsMhxLw+70gAADs='fullname = os.path.join(path, name)displayname = linkname = name# Append / for directories or @ for symbolic linksif os.path.isdir(fullname):dirimage = 'data:image/gif;base64,R0lGODlhGAAYAMIAAP///+jNlr+/v6KXfm5SG2lPGjc3NwAAACH+RFRoaXMgaWNvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gMTk5NSBLZXZpbiBIdWdoZXMsIGtldmluaEBlaXQuY29tACH5BAEAAAIALAAAAAAYABgAAANjKLrc/jDKSau9WJbN9y1BKIZFVQzjOHRdsw1wDIMpyYAFke9ELa4Lmm9IWBkUwqHPiFQSmYKkU1U4Rqe1YrWJTUGlWK0VjP12R2Jubx1guwPQqGxOj22DrLzeujD4/4CBgAoJADs='displayname = name + "/"linkname = name + "/"if os.path.islink(fullname):dirimage = 'data:image/gif;base64,R0lGODlhGAAYAPf/AJaWlpqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8LCwsPDw8bGxtDQ0NTU1NXV1dbW1tfX19jY2Nra2tzc3N3d3eDg4OHh4eLi4uPj4+Tk5OXl5efn5+np6erq6uvr6+zs7O7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pr6+vv7+/39/f7+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAGAAYAAAI/wCZCBxIsKDBgwgLrsigwUXChEVGYNBwIYKIJA8LFunwocKGDA8ieMg4kAiHDxRmCGyhIAEKkhtR2iCYYYEAkiNQ3ijYIQGAjDkuVFBJsIcBAhcyttCgoSCQBQcUFMn44gIFEiwE/oAqIAfJIREeQLDAZIeCAwO8IuQRowYSIxQgBFhAoQBatQaFiLCQoQIFCxEMREUwoAEPhEA0dMQwQSwCIEFYpKCR8IfiCjWYgJCr4AhJyx13CFRhQYECGBmRcKwgmmAEBCsyltBQQUfBGwUG4MjoYMOIgjsSIJBAskGGEAR3IEhw4AdJExIeyBCIY/kBHySZLNEwgcGGDQYQNBbPLpAIBgULEhB4AIQ8wRMFBIhQ4j4gADs='displayname = name + "@"if name.endswith(('.bmp','.gif','.jpg','.png')):dirimage = nameif name.endswith(('.avi','.mpg')):dirimage = 'data:image/gif;base64,R0lGODlhGAAYAMIAAP///7+/v7u7u1ZWVTc3NwAAAAAAAAAAACH+RFRoaXMgaWNvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gMTk5NSBLZXZpbiBIdWdoZXMsIGtldmluaEBlaXQuY29tACH5BAEAAAEALAAAAAAYABgAAANvGLrc/jAuQqu99BEh8OXE4GzdYJ4mQIZjNXAwp7oj+MbyKjY6ntstyg03E9ZKPoEKyLMll6UgAUCtVi07xspTYWptqBOUxXM9scfQ2Ttx+sbZifmNbiLpbEUPHy1TrIB1Xx1cFHkBW4VODmGNjQ4JADs='if name.endswith(('.idx','.srt','.sub')):dirimage = 'data:image/gif;base64,R0lGODlhGAAYAPf/AAAbDiAfDSoqHjQlADs+J3sxJ0BALERHMk5LN1pSPUZHRk9NQU1OR05ZUFBRRFVXTVdYTVtVQFlVRFtbSF5bTVZWUltbUFlZVFtcVlxdWl5eWl1gWmBiV2FiXWNhXGRjXWlpYmtqZ2xtZmxsaG5ubHJva3Jzb3J0bHN0b3Z5dHd8eXh4dX18dXx/dnt8e31+eahMP4JdWIdnZox4cpVoYKJkXrxqablwcNA6Otg7O/8AAPwHB/0GBvgODvsMDPMbG/ceHvkSEuYqKvYqKvU2NvM6OvQ6OsFQUNVbW8N4eNd0duNeXu9aWvFUVOVqau1jY+1mZu5mZuh5eYSFgIWGgYaFgIiGgYqKiY6LioyMiY2NiYyMio2OiI6OjZCSjZSQi5OSkJGUkpSVk5WVlJWVlZiZlpiZmJ6emp2dnZSko6GhnKGhoKOjoaKnoqSkpKSmpKWmpaampqqrqKurqKqrqq2sqq6urrSyrrCwsLa3tb63tbi4t7q6ur+/vsCbm96Li9iUlMqursmwr9KwsN69veSCguiMjOiOjuaQkOWVleaXmOGfn+aYmOaamuebm+adneecnOeenuiQkOWgoOWsrOasrOWxseW2tue3t+e8vOi+vsHBwcfHx8jIxs7Mx8nJyMvLy8zMy83NzM7Pzs/Pz9PR0dTU1NXV1dXW1tbW1tfX19bb29jY2NnZ2djb29ra2tvb2tvb29za2tzc3N3d3d7e3t/f3+bCwufDw+fGxuTJyejCwujHx+nHx+vPz+rT0+rU1OrX1+vX1+rY2Ojf3+Hh4eLi4uPj4+Hn5+Tk5OXl5ebm5ufn5+nn5+jo6Onp6erp6evr6+zs7PDn5/Dq6vDt7fHv7/Lu7vPu7vPv7/Dw8PHx8fLy8vPz8/Tx8fbz8/T09PX19fX39/b29vj39/j4+Pn4+Pn5+fr5+fr6+vv7+/z7+/z8/P39/f7+/v/+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAGAAYAAAI/wDhCRxIsKDBgwgTZis00F27hAbRNSpSaSC7ZM6ePQsXjdmzZekKUpOio0lBVShjJXvYjp07gsEm/dLhqKC2aNG2LesES13BXJTg4dLBi2C7kPDSyQFTRY26c8akZbolkJGOaQTZFTO2LA8KCCA+zDFTp4aggVCCmCtYrJUxNiI4nAjh4o2HGW1CrhvCxGC5cOVqvcCgQQUWGRtanOkG75qOQwXbhWvZ7lOZMIGSsJjihY5AYTowFWRnipUtT6BGWIARY8IXPc1eXtIxrKC7cqJCjdJCIcIBAwRoaLqU6IkRHthGnwPzoEGKDBISMHDAZWAvHUTWjaa1J42NAgAELMBAMGCNwHbWekQxqA4VMkBKSokZE8AKtHLpjuHxo0OSQXfuLKJIOHdc0IECFaxgQivpxHGDDpYc9McS5oBTAhxUbNHFFX2I4Q4fR+iwi0GPCCGLK6rYgQYJWZDhBil7cMMJDjpAAg85L8ETCRDVqAONMuGMA0446rDjEzzi5KDDD4j48g48huxAyCqtODNZOeWcM85DAxEDzDcE+YDEK5u0EostbZ2SyizsQASPE4PAo4466TxVZzptuqmLN266GRAAOw=='if name.endswith('.iso'):dirimage = 'data:image/gif;base64,R0lGODlhGAAYAPf/AKysrLGxsbe3t7i4uLm5uLm5ubq6ury8vL29vb6+vry+wb2+wKfeu7XGsbjNtr3UprnVqbbcvqjOzKTM0KbdwKvX2anZ1b/CxbTbw63R5LHS5b3T5dexrtuxrty+p+KvpOCxo8bLnsvJotjAptTPs9HRtcDAwMHBwcLCwsPDw8PCxMLDxsTDwsTEw8TExMXFxcbGxsfHx8jIyMnJycrJysrKysvLy87Ly8zMzM3Nzc7Ozs/PzsDe3NDQ0NHR0dLR0NLS0tPT09TU1NXV1dXW1tbW1tfX19HZ0dLb0NjV1NrW1djY2NnZ2dra2t3a2tzc3N3d3d7e3d/f3t/f38HU5cPf6sff68/e69Pf6sDi3Nng59zh5d7k5ujEw+nFxOnGxunIx+vLx+zNyePTy+Hf3+3Y0eDg3+Tg3+Dg4OHh4uLi4eLi4uPj4uPj4+Hj5OPk4+Th4OTk4+Tk5OXl5OXl5eXm5ebl5Obm5ebm5ubn5ufn5ufn5+Lm6uXo6unj4+rl5Ojo5+jo6Onp6Onp6erq6erq6urr6+vr6uvr6+vs6+zp6e3r6uzs6+zs7O3t7e3u7e7u7e7u7u/v7u/v7+fv9ezu8e3u8PDp6fHr6/Dw8PHx8PHx8fLy8fLy8vPy8vPz8vPz8/Tz8/T08/T09PX19PX19fX29fb19Pb29vf39vf39/j49/j4+Pn4+Pn5+Pn5+fr6+fr6+vv7+vv7+/z8+/z8/P39/P39/f7+/f7+/v7//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAGAAYAAAI/wB3CRxIsKBBg4hi6GCyBs+eQIH2PJSIB82QGYgKDnqBowmeRpEiTSo0qVGmSI3oGJkxSOOLGkXkIJpkBEEQHzagZEq5siXBjTOGtJnpwweKBFCE7FTJ0mXQoZH2TIGCh4kjR4jkFGn684UMIXIGTWkSpQ0bOTIbaa3hc+BGGUSeFIkyhxCkT6hKDaKztq3AQS5m3EgSZw4gRplIvbq1KxIUI2w1umDBAQycPIQkgVo1K9etWXSARP6pooGID1/+POKEKtatXLFSfQLCdWChBRIYPPAgBpMpVrV20WIFKpMUF4UKElKwIYOFCCTKKCrUSBWsUpkY3WmR/KcLN1quVPLJgmTRrViBPHlyJAgPDL+7BsW4AyhRJUpcQO3S1YePpUN62FHbXy/sUYgkobQiCSKvnHIED1ZgscUb72l0gh6OsCYLLY60QcYYJWBQgQZUXEBIQYWYYAYnitmSCy2ldHJJGCNAQMEEK3TnVgo5jMJZLra8UoomjfjRBQghOEADfIW88AIdtdyCSyyocMJeHWd40cEPA+4SSGA+TLJLLauAIkkhesgRhxJOLCHDHgXhwVETbTjCiiuiSHIIIGo8UYghTcyAR0GgyDCAAAYMEMAJO/QwAwEAFHCAAQXIMMpBmzhSyCCD4JHGFA0FMkghMxEUEAA7'# Note: a link to a directory displays with @ and links with /f.write(('<a href="%s"><img src="%s" width="24" height="24">&nbsp;&nbsp;&nbsp;%s</a><br />\n'% (urllib.parse.quote(linkname), dirimage , html.escape(displayname))).encode())f.write(b"<hr>\n</body>\n</html>\n")length = f.tell()f.seek(0)self.send_response(200)self.send_header("Content-type", "text/html")self.send_header("Content-Length", str(length))self.end_headers()return fdef translate_path(self, path):"""Translate a /-separated PATH to the local filename syntax.Components that mean special things to the local file system(e.g. drive or directory names) are ignored.  (XXX They shouldprobably be diagnosed.)"""# abandon query parameterspath = path.split('?',1)[0]path = path.split('#',1)[0]path = posixpath.normpath(urllib.parse.unquote(path))words = path.split('/')words = [_f for _f in words if _f]path = os.getcwd()for word in words:drive, word = os.path.splitdrive(word)head, word = os.path.split(word)if word in (os.curdir, os.pardir): continuepath = os.path.join(path, word)return pathdef copyfile(self, source, outputfile):"""Copy all data between two file objects.The SOURCE argument is a file object open for reading(or anything with a read() method) and the DESTINATIONargument is a file object open for writing (oranything with a write() method).The only reason for overriding this would be to changethe block size or perhaps to replace newlines by CRLF-- note however that this the default server uses thisto copy binary data as well."""shutil.copyfileobj(source, outputfile)def guess_type(self, path):"""Guess the type of a file.Argument is a PATH (a filename).Return value is a string of the form type/subtype,usable for a MIME Content-type header.The default implementation looks the file's extensionup in the table self.extensions_map, using application/octet-streamas a default; however it would be permissible (ifslow) to look inside the data to make a better guess."""base, ext = posixpath.splitext(path)if ext in self.extensions_map:return self.extensions_map[ext]ext = ext.lower()if ext in self.extensions_map:return self.extensions_map[ext]else:return self.extensions_map['']if not mimetypes.inited:mimetypes.init() # try to read system mime.typesextensions_map = mimetypes.types_map.copy()extensions_map.update({'': 'application/octet-stream', # Default'.py': 'text/plain','.c': 'text/plain','.h': 'text/plain',})parser = argparse.ArgumentParser()
parser.add_argument('--bind', '-b', default='', metavar='ADDRESS',help='Specify alternate bind address ''[default: all interfaces]')
parser.add_argument('port', action='store',default=8000, type=int,nargs='?',help='Specify alternate port [default: 8000]')
args = parser.parse_args()PORT = args.port
BIND = args.bind
HOST = BINDif HOST == '':HOST = 'localhost'Handler = SimpleHTTPRequestHandlerwith socketserver.TCPServer((BIND, PORT), Handler) as httpd:serve_message = "Serving HTTP on {host} port {port} (http://{host}:{port}/) ..."print(serve_message.format(host=HOST, port=PORT))httpd.serve_forever()

About 一行Python代码搞定局域网内文件共享与传输相关推荐

  1. 神操作!一行Python代码搞定一款游戏?给力!

    来源:pypl编程榜 一直以来Python长期霸占编程语言排行榜前三位,其简洁,功能强大的特性使越来越多的小伙伴开始学习Python .甚至K12的同学都开始学习Python 编程.新手入门的时候趣味 ...

  2. 用一行 Python 代码搞定炫酷可视化

    作者:xiaoyu,半路转行数据,首发自Python数据科学 前言 学过Python数据分析的朋友都知道,在可视化的工具中,有很多优秀的三方库,比如matplotlib,seaborn,plotly, ...

  3. python 一行_一行 Python 代码搞定炫酷可视化

    cf.set_config_file(offline=True) 然后我们需要按照上面的使用格式来操作,首先我们需要有个DataFrame,如果手头没啥数据,那可以先生成个随机数.cufflinks有 ...

  4. 【Python基础】pandas的骚操作:一行 pandas 代码搞定 Excel “条件格式”!

    来源:Python数据科学 作者:东哥起飞 本篇是pandas100个骚操作系列的第 7 篇:一行 pandas 代码搞定 Excel "条件格式"! 系列内容,请看????「pa ...

  5. python实现局域网攻击_牛逼了!一行Python代码搭建一个局域网服务器

    不知道大家有没有遇到过这样的情况, 在做项目或者研发的时候,迫切想要将一个文件传输给另一台电脑,却找不到U盘,于是麻烦的通过登陆qq.微信等社交软件 ,或者邮箱等工具进行传输,十分麻烦,让人苦恼. 都 ...

  6. 再见PDF提取收费!我用100行Python代码搞定!

    点上方"菜鸟学Python",选择"星标" 第471篇原创干货,第一时间送达 大家在日常的工作和学习过程中,都少不了与PDF文件打交道,很多的小伙伴都面临着将P ...

  7. 零基础如何用 15 行 Python 代码搞定网易云热门歌单?

    健身.吃饭.敲代码:等车.撸猫.下午茶--若能佐以合适的音乐当"配餐",总是惬意非常.本文就将带你爬一爬网易云的那些热门歌单! 作者 | 上海小胖 责编 | 仲培艺 心情好或心情坏 ...

  8. 60行Python代码搞定,王者荣耀雷达图!

    点击上方"菜鸟学Python",选择"星标"公众号 超级无敌干货第一时间推给你!!! 现有以下表格,我需要画成第二张图中的雷达图(类似fifa足球.王者荣耀里面 ...

  9. 【译】一行css代码搞定响应式布局

    译文出自:闪电矿工翻译组 原文地址: medium.com/free-code-c- 原文作者: Per Harald Borgen 仓库原文链接:issue 译者: hanxiansen 在这篇文章 ...

最新文章

  1. VMware助青年时报构建安全高效应用平台
  2. 驱动保护中的ObjectType_Callback探索
  3. 获取站点某一目录下某些文件
  4. Hyperledger Fabric 排序服务核心原理和工作过程
  5. RedisTemplate 使用 Redis 缓存
  6. java servlet深入理解_java 步步惊心 (web ) 深入理解servlet
  7. mysql 使用索引_mysql使用索引的注意事项
  8. 嵌入式软件设计第12次实验报告
  9. css小技巧: select的css控制
  10. 中文论文万能句型_干货|SCI论文写作的万能句型~
  11. php 虚拟主机ip配置文件,基于IP的虚拟主机配置
  12. nginx官方模块之http_random_index_module
  13. python可迭代对象相关的内建函数_python之函数闭包、可迭代对象和迭代器
  14. 网管教程+从入门到精通软件篇
  15. SAP标准功能导出期间发货数量的操作指导
  16. C# 使用ZXing.net生成一维码(带数字与不带数字)、二维码(带logo与不带logo)
  17. Windows历史版本下载
  18. Android 7.1开机之后APN的加载及拨号上网流程分析
  19. opengl 多边形线框_opengl基础学习专题 (三) 多边形绘制的几种样式
  20. 归因分析:淘宝直播数据助理及其价值研究

热门文章

  1. ubuntu20编译Gmssl时,“version OPENSSL_1_1_0d not defined”问题的较好解决办法
  2. 关于计算机审计应用分析的论文,计算机审计论文
  3. 神经网络是算法还是模型,神经元网络算法的思想
  4. 用于RF收发器的简单基带处理器详细教程
  5. 3D打印机T3升级corexy  制作过程(一)
  6. 简单分析一个通过 js 劫持进行案例
  7. 关闭苹果无线服务器,苹果iOS11 WiFi、蓝牙无法关闭怎么回事?附彻底关闭方法...
  8. [转知乎]网易云音乐的歌单推荐算法是怎样的?
  9. 【转载必读】如何应对美国警察——留学生一定要看
  10. 【渝粤题库】陕西师范大学202221保险学Ⅱ 作业(高起本、专升本)