python向ftp上传文件,解决中文问题
# coding: UTF-8
import os
import sys
import salt.client
import salt.config
import time
from ftplib import FTP, FTP_TLS
import json
from subprocess import Popen, PIPE, STDOUT agent_ids = agent_ip.split(',')
if '{' in sys_type:
sys_types=json.loads(sys_type)
else:
sys_types={}
for i in agent_ids:
sys_types.update({i:sys_type}) def get_source_file_path(source_file_path,agent_id):
global sys_types
sys_type=sys_types.get(agent_id)
if sys_type == 'windows':
if source_file_path.startswith('/'):
source_file_path='c:'+source_file_path
source_file_path = source_file_path.replace('\\\\', '/')
source_file_path = source_file_path.replace('\\', '/')
source_file_path=source_file_path.decode('gbk')
print source_file_path
else:
if isinstance(source_file_path, unicode):
source_file_path = source_file_path.encode('utf8')
file_paths = source_file_path.split('\n')
return file_paths if isinstance(ftp_dir, unicode):
ftp_dir = ftp_dir.encode('utf8') BASE_URL = os.getenv('ANT_BASEURL') fail = []
success = [] def agent_to_proxy():
global agent_ids, source_file_path, success, fail, BASE_URL
proxy_path = os.getenv('ANT_MODULE_ROOT', '')
master_conf = os.path.join(proxy_path, 'conf', 'master')
if not os.path.exists(master_conf):
print('Proxy 路径不正确 {}'.format(proxy_path))
sys.exit(1)
opts = salt.config.client_config(master_conf)
LocalClient = salt.client.LocalClient(master_conf)
CACHE_DIR = opts['cachedir']
for agent_id in agent_ids:
file_paths=get_source_file_path(source_file_path, agent_id)
print file_paths
ret = LocalClient.cmd(agent_id, 'cp.push', file_paths, expr_form='list')
no_exist_hosts = set(ret.keys()) - set(agent_ids)
print no_exist_hosts
if no_exist_hosts:
print('异常:{} agent 不存在'.format(list(no_exist_hosts)))
sys.exit(1)
for file_path in file_paths:
for host, status in ret.iteritems():
if status is True:
proxy_file_path = os.path.join(CACHE_DIR, 'minions', host, 'files',
file_path.lstrip('/'))
res = proxy_to_ftp(proxy_file_path)
if res:
print file_path, '上传成功'
else:
fail.append('{}:{}'.format(host, file_path))
elif status is False:
print('{}:{} 上传失败,可能文件不存在'.format(host, file_path))
fail.append('{}:{}'.format(host, file_path))
else:
print('异常:{}:{} 上传失败,{}'.format(host, file_path, status))
fail.append('{}:{}'.format(host, file_path)) def _conn_ftp(user, passwd):
global ftp_host, ftp_port, connect_type
conn = False ispasv = False if user in (None, 'false') else True ftp_url = ftp_host
connect_type = connect_type.lower()
port = ftp_port
try:
if ':' in ftp_url:
conn = True
ftp_url, port = ftp_url.split(':') if conn:
ftp = FTP()
ftp.connect(host=str(ftp_url), port=int(port))
else:
ftp = FTP(ftp_url)
ftp.login(user, passwd) except Exception as e:
if 'requires SSL.' in '{}'.format(e):
try:
if conn:
ftp = FTP_TLS()
ftp.connect(host=ftp_url, port=int(port))
else:
ftp = FTP_TLS(ftp_url)
ftp.login(user, passwd)
except Exception as e:
print e
sys.exit(1)
else:
print e
sys.exit(1)
return ftp, ispasv def proxy_to_ftp(proxy_file_path):
global username, password, ftp_dir
ftp, ispasv = _conn_ftp(username, password)
ftp.encoding = "utf-8"
try:
ftp.set_pasv(ispasv)
# ftp.retrlines('LIST')
except:
ftp.set_pasv(not ispasv)
now_path = ftp.pwd()
print now_path if ftp_dir and ftp_dir != '/':
try:
ftp.cwd(ftp_dir)
except:
new_path = os.path.join(now_path, ftp_dir.lstrip('/'))
print new_path
ftp.mkd(new_path)
ftp.cwd(new_path) try:
ftp.rename(os.path.basename(proxy_file_path).decode("utf8").encode('gbk'), os.path.basename(proxy_file_path).decode("utf8").encode('gbk')+'.'+time.strftime('%Y-%m-%d_%H:%M:%S'))
except:
pass
print proxy_file_path
with open(proxy_file_path, 'rb') as f_:
result = ftp.storbinary('STOR %s' % os.path.basename(proxy_file_path).decode("utf8").encode('gbk'), f_) ftp.close()
if 'Transfer complete.' in result:
return True
else:
return False try:
agent_to_proxy()
if success:
print '文件传输成功:{}'.format(','.join(success))
if fail:
print '文件传输失败:{}'.format(','.join(fail))
sys.exit(1)
except Exception as e:
print e
sys.exit(1)
python向ftp上传文件,解决中文问题的更多相关文章
- 再看ftp上传文件
前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...
- Java ftp 上传文件和下载文件
今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...
- C# FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误
FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址."的错误 解决方法是在原代码上增加这句话 reqFTP.UsePassive = f ...
- .net FTP上传文件
FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...
- 通过cmd完成FTP上传文件操作
一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...
- FTP上传文件到服务器
一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...
- FTP上传文件提示550错误原因分析。
今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...
- FTP 上传文件
有时候需要通过FTP同步数据文件,除了比较稳定的IDE之外,我们程序员还可以根据实际的业务需求来开发具体的工具,具体的开发过程就不细说了,这里了解一下通过C#实现FTP上传文件到指定的地址. /// ...
- Python基于Python实现批量上传文件或目录到不同的Linux服务器
基于Python实现批量上传文件或目录到不同的Linux服务器 by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/rootpath_fo ...
随机推荐
- 类别不平衡问题和Softmax回归
目录 类别不平衡(class-imbalance) Softmax回归模型 类别不平衡(class-imbalance) 当不同类别的训练样本数目差别很大,则会对学习过程造成困扰.如有998个反例,但 ...
- vue 限制输入字符长度
一.watch方法: <input v-model="textareaValue" type="textarea" placeholder="请 ...
- Andriod App类型简介
App三种类型与区别 原生应用程序:(Native App) 原生APP是什么?原生APP就是利用Android.iOS平台官方的开发语言.开发类库.工具进行开发.比如安卓的java语言,iOS的ob ...
- java基础1之引用数据类型
5种引用类型(对象类型) 类 接口 数组 枚举 标注 类 类在JVM的内存空间的存储 (1). Heap 堆空间:分配对象 new Student() 存放引用数据类型的实例 (2). Stack 栈 ...
- linux中的&&,|| 与 () 命令
用&&连接两个命令,前一命令执成功(返回0)下一命令才会执行, 如 date && echo 1 会打印1,而data && echo 2不会打印2 & ...
- codeforces1107G Vasya and Maximum Profit 【模拟】
题目分析: 前缀和啥的模拟一下就行了. 代码: #include<bits/stdc++.h> using namespace std; ; int n,x,d[maxn],sta[max ...
- python 高阶函数之 reduce
1.正常写法 >>> from functools import reduce >>> def fn(x, y): ... return x * 10 + y .. ...
- python学习日记(isinstance和issubclass)
isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) issu ...
- properties文件操作
properties文件操作类 可以使用java.util.Properties读取.properties文件中的内容 import java.io.InputStream; import java. ...
- 深入理解JVM(5)——垃圾收集和内存分配策略
1.垃圾收集对象 垃圾收集主要是针对堆和方法区进行. 程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收. 哪 ...