zoukankan      html  css  js  c++  java
  • Python——操作smb文件服务器(上传和下载)

    最近在做上传和下载,然后文件比较大和多,就用到了文件服务器,文件服务器是实体机 ,不是在本地, 然后用python 通过pysmb模块就可以直接进行操作

    mac选择前往、连接服务器去查看文件服务器里都有什么

    pysmb

     安装:sudo pip install pysmb
    使用

    from smb.SMBConnection import *
    class SMBClient(object):
        '''
        smb连接客户端
        '''
        user_name = ''
        passwd = ''
        ip = ''
        prot = None
    
        status = False
        samba = None
    
        def __init__(self, user_name, passwd, ip, port=139):
            self.user_name = user_name
            self.passwd = passwd
            self.ip = ip
            self.port = port
    
        def connect(self):
            try:
                self.samba = SMBConnection(self.user_name, self.passwd, '', '', use_ntlm_v2=True)
                self.samba.connect(self.ip, self.port)
                self.status = self.samba.auth_result
            except:
                self.samba.close()
    
        def disconnect(self):
            if self.status:
                self.samba.close()
    
        def all_file_names_in_dir(self, service_name, dir_name):
            '''
            列出文件夹内所有文件名
            :param service_name:
            :param dir_name:
            :return:
            '''
            f_names = list()
            for e in self.samba.listPath(service_name, dir_name):
                #if len(e.filename) > 3: (会返回一些.的文件,需要过滤)
            if e.filename[0] != '.': f_names.append(e.filename) return f_names def download(self, f_names, service_name, smb_dir, local_dir): ''' 下载文件 :param f_names:文件名 :param service_name:服务名(smb中的文件夹名) :param smb_dir: smb文件夹 :param local_dir: 本地文件夹 :return: ''' assert isinstance(f_names, list) for f_name in f_names: f = open(os.path.join(local_dir, f_name), 'w') self.samba.retrieveFile(service_name, os.path.join(smb_dir, f_name), f) f.close()
      
      
    def upload(self, service_name, smb_dir, file_name):
    '''
    上传文件
    :param f_names:文件名
    :param service_name:服务名(smb中的文件夹名)
    :param smb_dir: smb文件夹
    :param local_dir: 本地文件夹
    :return:
    '''
    self.samba.storeFile(service_name, smb_dir, file_name)

    def createDir(self, service_name, path):
    """
    创建文件夹
    :param service_name:
    :param path:
    :return:
    """
    try:
    self.samba.createDirectory(service_name, path)

    except OperationFailure:
    pass

    def retrieveFiles(self,name, path, file):
      """
      查看文件大小
      """
    file_attr, filesize = self.samba.retrieveFile(name,path, file)
    return file_attr, filesize


     

    优缺点:函数功能丰富,文件下载功能只对普通文件如txt,dat,csv有效,压缩文件无效

    上传和下载差不多

    #下载文件到本地
         f = open('本地文件','w')  #就是要下载下来存放的那个文件的壳子
        samba.retrieveFile('共享空间','服务器文件地址',f)  #它会把文件写在f里面
        f.close()
        #上传文件到服务器
         f = open('本地文件','r')
        samba.storeFile('共享空间','服务器文件地址',f)
        f.close()
     
    #调用查看数据大小
    file_name = samba_temp.all_file_names_in_dir('hswjerp', 'erp/medium/海外版/海外电影/视频字幕/2019/07/26/十品官吴山羊')
    a = 'erp/medium/海外版/海外电影/视频字幕/2019/07/26/十品官吴山羊'
    # os.path.dirname():去掉脚本的文件名,返回目录。
    # print(fielname)
    objfile = tempfile.NamedTemporaryFile()
    for i in file_name:
    file,filesize = samba_temp.retrieveFiles('hswjerp',join(a,i), objfile)
    print(file,filesize)

    fs.smbfs

     安装:sudo pip2 install fs.smbfs
    使用

        import fs.smbfs
        smb = fs.smbfs.SMBFS(host='****', username='****', passwd='***')
        smb.opendir('***')
        for e in smb.listdir():
            print e
        smb.close()

     优缺点:host属性中直接输入ip无效,报错fs.errors.CreateFailed: could not get IP/host pair from '*.*.*.193',包的作者目前也没有解决这个问题。

    pysmbclient

    安装:sudo pip2 install pysmbclient
    使用:

        import smbclient
    
        smb = smbclient.SambaClient(server='*.*.*.103', username=u'***', password='***', share=u'数据共享/')
        for e in smb.listdir(u'/'):
            smb.download(os.path.join(u'/', e), os.path.join('~/smb', e))
        smb.close()

    优缺点:可以完成普通文件和压缩文件从samba下载到本地

  • 相关阅读:
    JDK里面包含jre,为什么还要下载一个jre呢?
    2021年11月2日,面试经历
    linux内核学习心得
    关于QQ短信接口的使用。
    软件测试--开发者测试例子
    此博客相关声明·AP2017060911I
    21RNC201906034I·代码重构
    20RNC201901313I·代码重构
    19RND201808172·层次设定
    18RND201801311·图像方案日记
  • 原文地址:https://www.cnblogs.com/yuanfang0903/p/11169729.html
Copyright © 2011-2022 走看看