我正在从主机获取文件,该文件将被另一个系统使用。我意识到我需要在从远程服务器下载文件时重命名文件,以避免数据损坏。您是否知道有没有一种方法可以实现,可能是get()
函数与StringIO结合使用?还是用织物不可能?
已编辑:请提供我的代码示例。
# ~/fabfile.py
from fabric.api import task, env, run, settings, cd, put, get, execute
@task
def send_files():
'''
Send the downloaded files (found.txt) from remote to the server
'''
# Get the sorted list of filenames (to send the files in order)
with settings(war_only=True):
with cd(REMOTE_DIR):
sorted_list = sort_files()
for file in sorted_list:
print(file)
file = file.replace('\n', '')
#Something here to change the extension
#when the download is complete change to the original extension
# Example
# get 427783.zip
# change to 427783.crdownload
# back to 427783.zip when is done.
get(REMOTE_DIR + DESTINATION + '/' + file, INPUT_FOLDER + '\\' + file)
我想我必须重新回答我的问题:我想知道何时使用结构ftp连接和get()方法完成下载,另一项服务将选择该文件,并希望避免下载尚未完成。
答案 0 :(得分:0)
使用wget
将解决您的问题。您可以执行以下操作:
with connection(host=host, user=user) as c:
save_path = '/var/www/new_name.extension'
source_path = 'where_your_file_resides'
c.run('wget -p -O %s %s' %(save_path, source_path)
答案 1 :(得分:0)
在下载过程中,我没有找到合适的示例来自动更改扩展名。因此,我弄清楚了这个问题,并使用另一个临时扩展名下载了文件,一旦get()函数完成结构将执行下一个命令,因此我可以利用此优势并重命名文件。
赞:
def rename_file(original, output):
try:
os.rename(original, output)
except WindowsError:
os.remove(output)
os.rename(original, output)
@task
def send_files():
with settings(war_only=True):
with cd(REMOTE_DIR):
sorted_list = sort_files()
for file in sorted_list:
old_file = REMOTE_DIR + DESTINATION + '/' + file
temp_file = INPUT_OTDF_FOLDER + '\\' + file + '.tmp'
get(old_file, temp_file)
rename_file(temp_file, new_file)