实习 week(三)

使用xshell访问服务器,对于新手的我来说,太。。。,没有界面,从头到尾都要靠指令执行,麻烦!

 

1、xftp软件

如果将文件拷贝到本地,那就要使用xftp软件,windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件。Xftp 能同时适应初级用户和高级用户的需要。它采用了标准的 Windows 风格的向导,它简单的界面能与其他 Windows 应用程序紧密地协同工作,此外它还为高级用户提供了众多强劲地功能特性。

    网上直接收索下载安装即可,xshell搭配xftp使用很适合我这种初级用户。

2、远程调试

还有一些不方便的是,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

 

3、http超文本协议

全面解析: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.

4、OS模块

简单的来说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)。

    • root 所指的是当前正在遍历的这个文件夹的本身的地址
    • dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    • files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
  • 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_))

5、python模块之zipfile

利用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)解压

ZipFile.extractall([path[, members[, pwd]]])

解压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()

 

6、Python hashlib模块 (主要记录md5加密)

利用python对文件夹中的所有文件进行MD5计算

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)。128位长度。目前MD5是一种不可逆算法。

具有很高的安全性。它对应任何字符串都可以加密成一段唯一的固定长度的代码。

用途:

根据这种唯一性,可以计算两个文件MD5码,判断两个文件是否相同;

Python的functools模块用以为可调用对象(callable objects)定义高阶函数或操作。简单地说,就是基于已有的函数定义新的函数。
所谓高阶函数,就是以函数作为输入参数,返回也是函数。

1. functools模块的引用

from functools import partial

2. functools模块的组成

  • partial(func, *args, **keywords)

通过封装,重新定义已有的函数,如增减参数、设置初始值或改变返回值。
该函数的返回partial对象,其中包含3个只读属性:

    •  partial.func
    •  partial.args
    •  partial.keywords
  • @total_ordering
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上传得过程中采用了文本模式,会把文件中换行回车替换为换行。于是重新用二进制模式上传,计算结果一致,问题解决。

 

你可能感兴趣的:(Python,实习)