使用xshell访问服务器,对于新手的我来说,太。。。,没有界面,从头到尾都要靠指令执行,麻烦!
如果将文件拷贝到本地,那就要使用xftp软件,windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件。Xftp 能同时适应初级用户和高级用户的需要。它采用了标准的 Windows 风格的向导,它简单的界面能与其他 Windows 应用程序紧密地协同工作,此外它还为高级用户提供了众多强劲地功能特性。
网上直接收索下载安装即可,xshell搭配xftp使用很适合我这种初级用户。
还有一些不方便的是,IDE安装在Windows系统上,例如递归爬取网页链接,执行程序后,程序会卡住,得不到结果,而直接在服务器上编写,又不熟练。因此许多IDE可以连接到服务器,进行远程调试。如pycharm,它的专业版可以远程而社区版不行,但是专业版收费。可以从网上找到破解版:
Pycharm Professional(专业版)完美破解,永久激活https://blog.csdn.net/px41834/article/details/79256024/
利用PyCharm进行Python远程调试:https://www.cnblogs.com/jinjiangongzuoshi/p/5638706.html
Python面向对象编程指南:https://blog.csdn.net/zhoudaxia/article/details/23341261
全面解析:https://blog.csdn.net/qq_21688757/article/details/53400767
IP:唯一标识每台主机 / 设备的地址
DNS:Domain Name System,域名系统,因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
一个IP可以对应多个DNS
一台主机可以配置多个IP
主机域名的一般结构为:主机名.三级域名.二级域名.顶级域名。 Internet 的顶级域名由 Internet网络协会域名注册查询负责网络地址分配的委员会进行登记和管理,它还为 Internet的每一台主机分配唯一的 IP 地址。
顶级域名:
.com:表示商业机构
.cn:表示中国国家域名
.top:表示高端,顶级,事业突破,国际通用域名
.net:表示网络服务机构
.org:表示非营利性组织
.gov:表示政府机构
.edu:表示教育机构
子网掩码:指明一个IP地址哪些标识主机所在的子网,哪些标识主机位掩码
网关地址:一个网络通向其他网络的IP地址
地址类别:IP(ipv4)32位由网络地址和主机地址
n为网络位,h为主机位
A类:0nnnnnnn,hhhhhhhh,hhhhhhhh,hhhhhhhh
7位网络编号,24位主机编号,
共126个A类网络2^7-1(不能全0)-1(不能全1)
每个网络可以拥有主机数2^24-2(不能全0或1)
范围:1.0.0.1------------127.255.255.255
B类:10nnnnnn,nnnnnnnn,hhhhhhhh,hhhhhhhh
14位网络编号,16位主机编号
共有2^14-2个网络,每个网络的主机数2^16-2个
范围:128.0.0.1---------191.255.255.255
C类:110nnnnn,nnnnnnnn,nnnnnnnn,hhhhhhhh
21位网络编号,8位主机编号
共有2^21-2个网络,每个网络的主机数2^8-2个
范围:192.0.0.1---------233.255.255.255
IP是由因特网信息中心统一分配的以保证其唯一性,有一类IP不用申请直接用于内网(Private Address),Private Address不会被INTERNET上的任何路由器转发,欲接入INTERNET必须要通过NAT/PAT转换,以公有IP的形式接入。
私有地址为:
10.0.0.0-10.255.255.255(一个A类地址)
172.16.0.0-172.31.255.255(16个B类地址)
192.168.0.0-192.168.255.255(256个C类地址)
子网掩码:屏蔽一个IP地址网络部分为1的比特模式,区别网络标识与主机标识
A类默认:255.0.0.0
B类默认:255.255.0.0
C类默认:255.255.255.0
左边表示网络位(1),右边表示主机位(0)
1的数目=网络位数,0的数目=主机位数
子网掩码与IP地址按位与运算,用0屏蔽主机数
子网掩码计算:
(1)已知子网数
子网数化成二进制后获得二进制的位数N,将主机位的前N位取1,剩余取0
(2)已知主机数
主机数化成二进制后获得二进制的位数M,将主机位从后到前M位取0,剩余的取1.
简单的来说OS模块它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作。
import os #导入os模块
help(os) #查看os模块帮助文档,里面详细的模块相关函数和使用方法
os.listdir() 列出当前目录下的所有文件和文件夹。
os.path.abspath(path) #返回绝对路径
os.path.basename(path) #返回文件名
os.path.commonprefix(list) #返回list(多个路径)中,所有path共有的最长的路径。
os.path.dirname(path) #返回文件路径
os.path.exists(path) #路径存在则返回True,路径损坏返回False
os.path.lexists #路径存在则返回True,路径损坏也返回True
os.path.expanduser(path) #把path中包含的"~"和"~user"转换成用户目录
os.path.expandvars(path) #根据环境变量的值替换path中包含的”$name”和”${name}”
os.path.getatime(path) #返回最后一次进入此path的时间。
os.path.getmtime(path) #返回在此path下最后一次修改的时间。
os.path.getctime(path) #返回path的大小
os.path.getsize(path) #返回文件大小,如果文件不存在就返回错误
os.path.isabs(path) #判断是否为绝对路径
os.path.isfile(path) #判断路径是否为文件
os.path.isdir(path) #判断路径是否为目录
os.path.islink(path) #判断路径是否为链接
os.path.ismount(path) #判断路径是否为挂载点()
os.path.join(path1[, path2[, ...]]) #把目录和文件名合成一个路径
os.path.normcase(path) #转换path的大小写和斜杠
os.path.normpath(path) #规范path字符串形式
os.path.realpath(path) #返回path的真实路径
os.path.relpath(path[, start]) #从start开始计算相对路径
os.path.samefile(path1, path2) #判断目录或文件是否相同
os.path.sameopenfile(fp1, fp2) #判断fp1和fp2是否指向同一文件
os.path.samestat(stat1, stat2) #判断stat tuple stat1和stat2是否指向同一个文件
os.path.split(path) #把路径分割成dirname和basename,返回一个元组
os.path.splitdrive(path) #一般用在windows下,返回驱动器名和路径组成的元组
os.path.splitext(path) #分割路径,返回路径名和文件扩展名的元组
os.path.splitunc(path) #把路径分割为加载点与文件
os.path.walk(path, visit, arg) #遍历path,进入每个目录都调用visit函数,visit函数必须有
3个参数(arg, dirname, names),dirname表示当前目录的目录名,names代表当前目录下的所有
文件名,args则为walk的第三个参数
os.path.supports_unicode_filenames #设置是否支持unicode路径名
import os
path='unzip_file/phpmyadmin-RELEASE_4_8_1/'
# 列出当前目录下的所有文件和文件夹
ls = os.listdir(path)
print(ls)
# # 创建名为tmp目录
# os.mkdir('tmp')
# # 移除名为tmp的目录
# os.rmdir('tmp')
# 获得当前路径,Windows系统通过是“\\”,Linux类系统如Ubuntu的分隔符是“/”
print(os.getcwd())
# 返回path规范化的绝对路径。
print(os.path.abspath(path) )
print(os.path.abspath('save_md5sum_result.txt'))
# 返回path文件的字节大小,可以传入绝对路径和相对路径
print(os.path.getsize('save_md5sum_result.txt'))
print(os.path.splitext('unzip_file/'))
# 如果path里面存在目录,返回True,否则返回False
print(os.path.isdir('zip_file/'))
file_num = 0
for i in ls:
# os.path.join组合多个路径并返回
# os.path.isfile(path)如果path是一个存在的文件,返回True,否者(otherwise)返回False
if os.path.isfile(os.path.join(path,i)):#只计算指定文件夹中的文件,包含在内的文件夹则忽略
file_num += 1
print (file_num)
os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。
os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
walk()方法语法格式如下:
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])
top -- 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。
topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。
onerror -- 可选, 需要一个 callable 对象,当 walk 需要异常时,会调用。
followlinks -- 可选, 如果为 True,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录(默认关闭)。
该方法没有返回值。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
print(os.path.join(root, name))#输出所有路径+文件名
for name in dirs:
print(os.path.join(root, name))#只输出当前文件夹中的文件夹名(目录)
#- * - coding: utf - 8 -*-
import os
def file_name(file_dir):
L = []
for root, dirs, files in os.walk(file_dir):
for file in files:#遍历所有文件
# 其中os.path.splitext()函数将路径拆分为文件名+扩展名
if os.path.splitext(file)[1] == '.js' or os.path.splitext(file)[1] == '.css':#选择js和css后缀名的文件
# 把目录和文件名合成一个路径
L.append(os.path.join(root, file))
return L
list_=file_name('unzip_file/')
for li in list_:
# 将路径中的\\替换为/
path=li.replace('\\','/')
print(path)
print(len(list_))
利用python 中的zip模块对文件的批量压缩/解压,参考:https://blog.csdn.net/db_guy/article/details/77993732
(1)压缩
f=zipfile.ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=False)
创建一个zip文件对象,压缩是需要把mode改为‘w’,这个是源码中的注释Open the ZIP file with mode read "r", write "w" or append "a",a为追加压缩,不会清空原来的zip
f.write(filename)
将文件写入zip文件中,即将文件压缩
f.close()
将zip文件对象关闭,与open一样可以使用上下文with as
import os,os.path
import zipfile
# 压缩
def zip_dir(file_path,zfile_path):
'''
function:压缩
params:
file_path:要压缩的件路径,可以是文件夹
zfile_path:保存压缩路径
description:可以在python2执行
'''
filelist = []
if os.path.isfile(file_path):#判断路径是否为文件
filelist.append(file_path)
else :#目录(文件夹)情况
for root, dirs, files in os.walk(file_path):
for name in files:#遍历文件列表
filelist.append(os.path.join(root, name))
print('joined:',os.path.join(root, name),dirs)
zf = zipfile.ZipFile(zfile_path, "w", zipfile.zlib.DEFLATED)
for tar in filelist:
(filepath, tempfilename) = os.path.split(tar)#将路径与文件分开
(shotname, extension) = os.path.splitext(tempfilename)#将文件名与扩展名分开
# arcname=tar.strip().split('/')[1]#取文件名
zf.write(tar,tempfilename)#将文件写入zip文件中,即将文件压缩
zf.close()
if __name__ == '__main__':
filepath = 'file_txt/'
#将文件夹中的文件分别压缩在各自的zip文件中
list_zipfile_path = [] # 保存所有文件
for root, dirs, files in os.walk(filepath):
list_zipfile_path=files
# 或
# list_zipfile_path = os.listdir(filepath)
print(list_zipfile_path)
for li in list_zipfile_path: # 遍历列表中的文件
zip_dir(filepath+ li, filepath+os.path.splitext(li)[0]+'.zip')
# 或将文件夹中的问价压缩到一个zip文件中
# zip_dir(filepath,filepath+'xxx.zip')
(2)解压
解压zip文档中的所有文件到当前目录。参数members的默认值为zip文档内的所有文件名称列表,也可以自己设置,选择要解压的文件名称。
import os,os.path
import zipfile
# 解压
def unzip_file(zfile_path, unzip_dir):
'''
function:解压
params:
zfile_path:压缩文件路径
unzip_dir:解压缩路径
description:
'''
try:
with zipfile.ZipFile(zfile_path) as zfile:
zfile.extractall(path=unzip_dir)
except zipfile.BadZipFile as e:
print (zfile_path+" is a bad zip file ,please check!")
if __name__ == '__main__':
filepath='zip_file/'
list_zipfile_path=[]#保存所有的压缩文件
# for root, dirs, files in os.walk(filepath):
# list_zipfile_path=files
#或
list_zipfile_path=os.listdir(filepath)
for li in list_zipfile_path:#遍历列表中的压缩文件
unzip_file('zip_file/'+li,r'unzip_file/')
以上路径是人为设置的,以下是利用窗口选择文件及压缩路径:
#运行只能进行一次,生成压缩文件,若再次运行会对压缩文件产生破坏,可以删除已生成的压缩文件
import os,os.path
import zipfile
from tkinter.filedialog import *
from tkinter import *
import time
import sys
# 压缩
def zip_dir(file_path,zfile_path):
'''
function:压缩
params:
file_path:要压缩的件路径,可以是文件夹
zfile_path:保存压缩路径
description:可以在python2执行
'''
filelist = []
if os.path.isfile(file_path):#判断路径是否为文件
filelist.append(file_path)
else :#目录(文件夹)情况
for root, dirs, files in os.walk(file_path):
for name in files:#遍历文件列表
filelist.append(os.path.join(root, name))
print('joined:',os.path.join(root, name),dirs)
zf = zipfile.ZipFile(zfile_path, "w", zipfile.zlib.DEFLATED)
for tar in filelist:
(filepath, tempfilename) = os.path.split(tar)#将路径与文件分开
(shotname, extension) = os.path.splitext(tempfilename)#将文件名与扩展名分开
# arcname=tar.strip().split('/')[1]#取文件名
zf.write(tar,tempfilename)#将文件写入zip文件中,即将文件压缩
zf.close()
def selectPath():
# askdirectory()方法是返回文件夹路径不是文件路径。
file_dir_path = askdirectory()
path.set(file_dir_path)
save_dict_file=askdirectory()
path_.set(save_dict_file)
list_zipfile_path = [] # 保存所有文件
if file_dir_path.strip() != '':
for root, dirs, files in os.walk(file_dir_path):
list_zipfile_path = files
# print(list_zipfile_path)
for li in list_zipfile_path: # 遍历列表中的文件
zip_dir(file_dir_path + '/' + li, save_dict_file + '/' + os.path.splitext(li)[0] + '.zip')
def Close():
root.destroy()
if __name__ == '__main__':
root=Tk()
path=StringVar()
path_ = StringVar()
Label(root,text='目标路径:').grid(row=0,column=0)
Entry(root,textvariable=path).grid(row=0,column=1)
Button(root,text='路径选择',command=selectPath).grid(row=0,column=2)
Label(root, text='保存路径:').grid(row=1, column=0)
Entry(root, textvariable=path_).grid(row=1, column=1)
Button(root, text='路径选择', command=selectPath).grid(row=1, column=2)
Button(root, text='结束', command=Close).grid(row=2, column=1)
root.mainloop()
利用python对文件夹中的所有文件进行MD5计算
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)。128位长度。目前MD5是一种不可逆算法。
具有很高的安全性。它对应任何字符串都可以加密成一段唯一的固定长度的代码。
用途:
根据这种唯一性,可以计算两个文件MD5码,判断两个文件是否相同;
Python的functools模块用以为可调用对象(callable objects)定义高阶函数或操作。简单地说,就是基于已有的函数定义新的函数。
所谓高阶函数,就是以函数作为输入参数,返回也是函数。
1. functools模块的引用
from functools import partial
2. functools模块的组成
通过封装,重新定义已有的函数,如增减参数、设置初始值或改变返回值。
该函数的返回partial对象,其中包含3个只读属性:
import os, hashlib
from functools import partial
# 读取文件内容时,文件打开方式要用二进制方式(rb),
# 因为用户文件有可能是linux格式,如果用文本方式打开,
# 可能会改变原始的内容,造成计算不准。
def md5sum(filename):
with open(filename, 'rb') as f:#文件打开方式要用二进制方式(rb)
md5_result = hashlib.md5()#创建一个MD5加密对象
for buf in iter(partial(f.read, 128), b''):
md5_result.update(buf)#更新要加密的数据
return md5_result.hexdigest()#返回16字节的摘要,由传给update的string生成,摘要没有ascii字符
# 其中os.path.splitext()函数将路径拆分为文件名+扩展名
def file_name(file_dir):
List = []
for root, dirs, files in os.walk(file_dir):
for file in files:
if os.path.splitext(file)[1] == '.js' or os.path.splitext(file)[1] == '.css':#选择js和css文件
List.append(os.path.join(root, file))
return List
def main():
list_ = file_name('unzip_file/')# 获取当前文件'.'中的所有文件和文件夹名list
save_md5sum_result=open('save_md5sum_result.txt','w')
for li in list_:
path = li.replace('\\', '/')#将路径中的\\替换为/
print(path+':'+md5sum(path)) # 计算并显示md5码
save_md5sum_result.write('%s:%s\n'%(path,md5sum(path)))
main()
同一个文件在windows和linux下计算md5哈希不一致的原因:
读取文件内容时,文件打开方式要用二进制方式(rb),因为用户文件有可能是linux格式,如果用文本方式打开,可能会改变原始的内容,造成计算不准。
程序编写完毕,再windows测试都通过了,把文件上传到linux,再运行程序,居然算出来的md5哈希和windows不一样。
经过一阵跟踪、断点、打印发现,文件上传到linux后,大小居然发生了变化,原来问题出在ftp,ftp上传得过程中采用了文本模式,会把文件中换行回车替换为换行。于是重新用二进制模式上传,计算结果一致,问题解决。