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下载到本地