使用 python 将文件从 blob 容器复制到另一个容器
Copy files from blob container to another container using python
我正在尝试将 'specific files' 从一个文件夹复制到另一个文件夹。当我尝试在末尾使用通配符 (*) 时,复制不会发生。
但是如果我只提供文件夹名称,那么源文件夹中的所有文件都会毫无问题地复制到目标文件夹。
问题:使用通配符时不会发生文件复制。
你能帮我解决这个问题吗?
def copy_blob_files(account_name, account_key, copy_from_container, copy_to_container, copy_from_prefix):
try:
blob_service = BlockBlobService(account_name=account_name, account_key=account_key)
files = blob_service.list_blobs(copy_from_container, prefix=copy_from_prefix)
for f in files:
#print(f.name)
blob_service.copy_blob(copy_to_container, f.name.replace(copy_from_prefix,""), f"https://{account_name}.blob.core.windows.net/{copy_from_container}/{f.name}")
except:
print('Could not copy files from source to target')
copy_from_prefix = 'Folder1/FileName_20191104*.csv'
copy_blob_files (accountName, accesskey, copy_fromcontainer, copy_to_container, copy_from_prefix)
AzCopy 支持通配符,您可以从 Python 代码中执行 AzCopy。
可以在此处找到如何执行此操作的示例:How to run Azure CLI commands using python?
copy_blob
方法不支持通配符。
1。如果要复制指定模式的blob,可以在list_blobs()
方法中用前缀过滤blob(也不支持通配符)。在您的例子中,前缀看起来像 copy_from_prefix = 'Folder1/FileName_20191104'
,请注意没有通配符。
下面的代码在我这边有效,所有指定的模式文件都是副本并替换了 blob 名称:
from azure.storage.blob import BlockBlobService
account_name ="xxx"
account_key ="xxx"
copy_from_container="test7"
copy_to_container ="test4"
#remove the wildcard
copy_from_prefix = 'Folder1/FileName_20191104'
def copy_blob_files(account_name, account_key, copy_from_container, copy_to_container, copy_from_prefix):
try:
block_blob_service = BlockBlobService(account_name,account_key)
files = block_blob_service.list_blobs(copy_from_container,copy_from_prefix)
for file in files:
block_blob_service.copy_blob(copy_to_container,file.name.replace(copy_from_prefix,""),f"https://{account_name}.blob.core.windows.net/{copy_from_container}/{file.name}")
except:
print('could not copy files')
copy_blob_files(account_name,account_key,copy_from_container,copy_to_container,copy_from_prefix)
2。其他人提到的另一种方式,你可以使用python调用azcopy(你可以使用azcopy v10, which is just a .exe file). And for using wildcard in azcopy, you can follow this doc。然后你写你自己的azcopy命令,最后,编写你的 python 代码如下:
import subprocess
#the path of azcopy.exe, v10 version
exepath = "D:\azcopy\v10\azcopy.exe"
myscript= "your azcopy command"
#call the azcopy command
subprocess.call(myscript)
我正在尝试将 'specific files' 从一个文件夹复制到另一个文件夹。当我尝试在末尾使用通配符 (*) 时,复制不会发生。
但是如果我只提供文件夹名称,那么源文件夹中的所有文件都会毫无问题地复制到目标文件夹。
问题:使用通配符时不会发生文件复制。 你能帮我解决这个问题吗?
def copy_blob_files(account_name, account_key, copy_from_container, copy_to_container, copy_from_prefix):
try:
blob_service = BlockBlobService(account_name=account_name, account_key=account_key)
files = blob_service.list_blobs(copy_from_container, prefix=copy_from_prefix)
for f in files:
#print(f.name)
blob_service.copy_blob(copy_to_container, f.name.replace(copy_from_prefix,""), f"https://{account_name}.blob.core.windows.net/{copy_from_container}/{f.name}")
except:
print('Could not copy files from source to target')
copy_from_prefix = 'Folder1/FileName_20191104*.csv'
copy_blob_files (accountName, accesskey, copy_fromcontainer, copy_to_container, copy_from_prefix)
AzCopy 支持通配符,您可以从 Python 代码中执行 AzCopy。
可以在此处找到如何执行此操作的示例:How to run Azure CLI commands using python?
copy_blob
方法不支持通配符。
1。如果要复制指定模式的blob,可以在list_blobs()
方法中用前缀过滤blob(也不支持通配符)。在您的例子中,前缀看起来像 copy_from_prefix = 'Folder1/FileName_20191104'
,请注意没有通配符。
下面的代码在我这边有效,所有指定的模式文件都是副本并替换了 blob 名称:
from azure.storage.blob import BlockBlobService
account_name ="xxx"
account_key ="xxx"
copy_from_container="test7"
copy_to_container ="test4"
#remove the wildcard
copy_from_prefix = 'Folder1/FileName_20191104'
def copy_blob_files(account_name, account_key, copy_from_container, copy_to_container, copy_from_prefix):
try:
block_blob_service = BlockBlobService(account_name,account_key)
files = block_blob_service.list_blobs(copy_from_container,copy_from_prefix)
for file in files:
block_blob_service.copy_blob(copy_to_container,file.name.replace(copy_from_prefix,""),f"https://{account_name}.blob.core.windows.net/{copy_from_container}/{file.name}")
except:
print('could not copy files')
copy_blob_files(account_name,account_key,copy_from_container,copy_to_container,copy_from_prefix)
2。其他人提到的另一种方式,你可以使用python调用azcopy(你可以使用azcopy v10, which is just a .exe file). And for using wildcard in azcopy, you can follow this doc。然后你写你自己的azcopy命令,最后,编写你的 python 代码如下:
import subprocess
#the path of azcopy.exe, v10 version
exepath = "D:\azcopy\v10\azcopy.exe"
myscript= "your azcopy command"
#call the azcopy command
subprocess.call(myscript)