远端FTP文件与本地文件如何进行Diff

前言

FTP 服务器是日常工作中比较常用的一种配置,可用于与外部文件共享。
例如:作为与 A 公司合作的第三方 B 公司,A 公司每天需要获取 B 公司提供的某些关键数据信息,那么 A 公司可以通过何种方式来获取 B 公司的数据信息呢?

 

答案:

A 公司与 B 公司共同协商搭建一台 FTP 的共享服务器,设置好IP,Port,用户名,密码等关键信息,B 公司将 A 公司所需的数据信息以文件形式上传到该台 FTP 的共享服务器上,A 公司再进入到该 FTP 服务器上进行读取。

这个过程通过 FTP 服务器完成了数据信息的共享。当然这只是 FTP 服务器比较常用的一个功能。除了使用 FTP 服务器共享数据的方式来获取数据,也可以将 A 公司与 B 公司的网络打通,通过接口调用的方式来实现数据的传输。

工作中曾遇到过将 FTP 服务器上的文件与本地文件进行 diff 的需求,为此我使用 Python 代码实现了此需求。供大家参考。

 

今日分享主题:远端 FTP 服务器上的文件与本地文件如何进行 diff。

Python 代码实现

1、远端服务器配置信息

import paramiko
import stat
import os
 
server_ip='ftps.test.com'
server_port=22
username='test'
password='123456'

2、从远端服务器上获取所有文件的列表

def get_all_files_in_remote_dir(sftp,remote_dir):
     all_files=[]
     if(remote_dir[-1]=='/'):
         remote_dir=remote_dir[0:-1]
     print("-----------------",remote_dir)
     files=sftp.listdir_attr(remote_dir)
     print("=================",files)
     for file in files:
         filename=remote_dir+'/'+file.filename
        #判断文件是否是目录
        if(stat.S_ISDIR(file.st_mode)):
            all_files.extend(get_all_files_in_remote_dir(sftp,filename))
        else:
            all_files.append(filename)
    return all_files

3、从远端服务器下载指定目录下的文件

def sftp_get_dir(remote_dir,local_dir):
     t = paramiko.Transport((server_ip, server_port))
     t.connect(username=username, password=password)
     sftp = paramiko.SFTPClient.from_transport(t)
 
     #获取sftp上所有文件列表
     all_files=get_all_files_in_remote_dir(sftp,remote_dir)
 
     for file in all_files:
        print(file)
        dir1 = local_dir + os.path.split(file)[0]
        print("the direction is:", dir1)
        print('the mkdir command is:mkdir -p ' + dir1)
        os.popen('mkdir -p ' + dir1)
        filename = file.split('/')[-1]
        local_filename = os.path.join(dir1, filename)
        print("the file name is:", local_filename)
        if (filename.startswith('.')):
            pass
        else:
            try:
                print("the %s file is downing" % filename)
                sftp.get(file, local_filename)
            except:
                print("the %s file is download fail " % filename)

4、diff 远端服务器下载下来文件的md5值与本地文件的 md5 值

def diff_file_md5sum(remote_dir,local_dir):
     for root,dirs,files in os.walk(remote_dir):
         for dir_list in dirs:
             print(os.path.join(root,dir_list))
         for files_list in files:
             remote_filename=os.path.join(root,files_list)
             local_filename=remote_filename.replace("tony","sftp")
             if(os.path.exists(local_filename)):
 
                print('md5sum remote_file---'+str(remote_filename))
                print('md5sum local_file---'+str(local_filename))
                remote_cmd='md5sum '+str(remote_filename)
                local_cmd='md5sum '+str(local_filename)
                list1=os.popen(remote_cmd).readlines()
                list2=os.popen(local_cmd).readlines()
                try:
                    remote_md5sum=str(list1[0]).split(" ")[0]
                    local_md5sum=str(list2[0]).split(" ")[0]
                except:
                    print("the list1 or list2 is null")
                #对比远端文件与本地文件的md5值
                if(remote_md5sum==local_md5sum):
                    print("the remote_md5sum is:%s, the local_md5sum is:%s" %(remote_md5sum,local_md5sum))
                    print(remote_filename," is ok")
                else:
                    print(remote_filename,"----------------------------------------------------------------------------------------------------------------------------- of the file is error")
 
 
if __name__ == "__main__":
    sftp_get_dir('/CoBrand/','/home/q/tony')
    sftp_get_dir('/COMM/','/home/q/tony')
    diff_file_md5sum('/home/q/tony','/home/q/sftp')

欢迎关注【无量测试之道】公众号,回复【领取资源】
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、
资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:


添加关注,让我们一起共同成长!

posted on 2021-08-18 14:03  Wu_Candy  阅读(199)  评论(0编辑  收藏  举报