【Python】smb共有サーバー(共有ディスク)ファイルのアップロードとダウンロード


ローカルエリアネットワークまたは外部ネットワークでsmb共有サーバにファイルをアップロードする必要がある場合、pythonの実装は以下の通りです.
一、pysmbパッケージのインストール
pipコマンドを使用してpysmbパッケージをインストールします.pysmbパッケージはsmbプロトコルをサポートするファイル管理モジュールです.デフォルトでは持たないので、自分でこのパッケージをインストールする必要があります.pysmbをインストールするコマンド:pip install pysmbまたはpip3 install pysmb一つはpython 2で、一つはpython 3です.
pipはpythonパッケージ管理ツールで、pipコマンドが見つからない場合はpipをインストールする必要があります.一般的にはデフォルトでインストールされています.
二、smbサーバーにログインする
smbパッケージをインポートするには、次の手順に従います.from smb.SMBConnection import SMBConnection
ログインsmbサーバコードの例:
#!/usr/local/bin/python3
from smb.SMBConnection import SMBConnection
host="xxx.xxx.xxx.xxx"  #ip   
username="xxxxxx"
password="xxxxxx"
conn=SMBConnection(username,password,"","",use_ntlm_v2 = True)
result = conn.connect(host, 445) #smb      445
print("    ")

三、smbサーバーにファイルをアップロードする

localFile=open("      ","rb") 
#rb  read+binary  , “      ”
#      ,          ,  zip ,      b, binary  ,   t  , text    。
#  :localFile=open("/Users/devnn/Desktop/test.zip","rb") 

conn.storeFile("       ","    ",localFile) 
#“       ”      ,    smb        。“    ”            。
#     smb   ,    30 ,        :timeout=xx。
#  :conn.storeFile("test","test1/test2/test3.zip",localFile) 

localFile.close() 
#  
print("    ")

なお、バイナリファイルをアップロードする場合、ローカルファイルを開いてパラメータbを付けないと、UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbc in position 2: invalid start byteという異常が投げ出されます.これは、ファイルがテキストファイルとして扱われているため、バイナリファイルが通常の文字に変換できないためです.そのため、バイナリファイル読み込みに変更する必要があります.
四、smbサーバーからファイルをローカルにダウンロードする
ファイルをダウンロードするには、open()関数の2番目のパラメータを書き込みモードに変更する必要があります.
localFile=open("        ","wb")  #      

「ダウンロード後のファイルパス」は、フォルダパスではなくファイルパスです.たとえば、「/Users/devnn/desktop/test.zip」では、ファイルが存在しないと自動的に作成されます.
完全なコードは次のとおりです.
localFile=open("        ","wb") 
#      ,          ,  zip ,      b, binary  ,   t  , text    。
#  :localFile=open("/Users/devnn/Desktop/test.zip","wb") 

conn.retrieveFile("       ","      ",localFile) 
# smb          ,    30 ,    :timeout=xx。“      ”           ,    "/".
#  :conn.retrieveFile("test","test1/test2/test3.zip",localFile)

localFile.close() 
#  
print("    ")