In [42]:
import shutil
out_file = "D:\share\ex_136566.temp"
shutil.move(out_file, out_file.replace('.temp', '.pdf'))
Out[42]:
'D:\\share\\ex_136566.pdf'
In [30]:
import time
import socket
import datetime
def get_cur_time():
# 获取当前时间
current_time = datetime.datetime.now()
return current_time
def get_cur_hour_and_min():
cur_time = get_cur_time()
return cur_time.hour, cur_time.minute
get_cur_hour_and_min(),datetime.datetime.now()
Out[30]:
(13, 21)
文件统计¶
In [16]:
ftp.quit()
Out[16]:
'221 Goodbye.'
In [4]:
import ftplib
ftp = ftplib.FTP()
ftp.connect('10.150.90.68', 21)
ftp.login('ftpuser', 'ftpuserpwd')
ftp.set_pasv(False)
dir_count = 0
try:
total_count = 0
def count_files(ftp, path):
global total_count, dir_count
print(dir_count, path, end="\r")
ftp.cwd(path)
files = []
ftp.retrlines(f'LIST {path}', callback=files.append)
for file in files:
if not file.startswith("d"):
total_count += 1
else:
file = file.split(" ")[-1]
dir_count += 1
count_files(ftp, path + '/' + file)
count_files(ftp, '/data02/gwc')
print("file_total_count",total_count, "dir_count", dir_count)
finally:
ftp.quit()
批量添加白名单¶
In [27]:
import requests
cookies = {
'sid': 'fb1c8fa6-1f11-4436-8729-dcc77edca6cd',
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
# 'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/json;charset=utf-8',
'Origin': 'http://config.emnj',
'Connection': 'keep-alive',
'Referer': 'http://config.emnj/',
# 'Cookie': 'sid=fb1c8fa6-1f11-4436-8729-dcc77edca6cd',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
}
with open(r'D:\DongDongsFiles\file\2023-07\通用爬虫50台(1).txt', 'r', encoding='utf-8') as fpr:
for ip in fpr:
json_data = {
'ip': ip.strip(),
'remark': '',
'appId': 173,
'projProfileId': 109,
}
print(ip, requests.post(
'http://config.emnj/config-web/api/applicationWhitelist',
cookies=cookies,
headers=headers,
json=json_data,
).json())
# Note: json_data will not be serialized by requests
# exactly as it was in the original request.
#data = '{"ip":"10.150.108.17","remark":"","appId":173,"projProfileId":109}'
#response = requests.post('http://config.emnj/config-web/api/applicationWhitelist', cookies=cookies, headers=headers, data=data)
10.150.108.181 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.182 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.183 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.184 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.185 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.186 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.187 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.188 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.189 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.190 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.191 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.192 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.193 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.194 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.195 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.196 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.197 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.198 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.199 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.200 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.201 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.202 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.203 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.204 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.205 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.206 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.207 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.208 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.209 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.210 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.211 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.212 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.213 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.214 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.215 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.216 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.217 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.218 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.219 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.220 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.221 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.222 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.223 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.224 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.225 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.226 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.227 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.228 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.229 {'success': True, 'code': '0', 'message': 'Success', 'data': True} 10.150.108.230 {'success': True, 'code': '0', 'message': 'Success', 'data': True}
文件上传¶
In [41]:
import ftplib
import os
import shutil
import time
import socket
# region config
dst_dir = r'/data02/test'
src_dir = r'D:\vdb\output'
file_suffix = 'pdf'
err_detail_file_path="ftp_upload_error.txt"
origin_dst_dir = dst_dir
hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
cdate = time.strftime("%Y%m%d", time.gmtime())
dst_dir = f'{dst_dir}/{ip_address}.{cdate}'
move_dir = f'{src_dir}_{ip_address}.{cdate}'
if not os.path.exists(move_dir):
os.mkdir(move_dir)
print("创建本地文件夹", move_dir)
# endregion
# 统计信息
stat_info = {}
stat_info["src dir"] = src_dir
stat_info["dst dir"] = dst_dir
stat_info["上传完成后,将本地文件移动至"] = dst_dir
assert input(f'当前IP: {ip_address}\n请确认路径,src_dir={src_dir} ==> dst_dir={dst_dir}? [y]es [n]o').strip(
).lower() == 'y', "用户取消上传"
assert dst_dir.startswith(
"/data") or dst_dir.startswith(r"\data"), f"目标文件夹不对,你指定的是【{dst_dir}】, 必须在 /data/ 下面"
print(src_dir, '==>', dst_dir)
print('文件上传后,将自动移动到: ', move_dir)
ftp = ftplib.FTP()
ftp.connect('10.150.90.68', 21)
ftp.login('ftpuser', 'ftpuserpwd')
ftp.set_pasv(False)
# 创建目标文件夹
try:
ftp.cwd(origin_dst_dir)
dir_names = []
ftp.dir(dir_names.append)
if os.path.basename(dst_dir) not in str(dir_names):
print("创建文件夹", ftp.mkd(dst_dir))
except Exception as e:
print("创建文件夹", dst_dir, "失败, err:", e)
print("切换工作文件夹", dst_dir)
ftp.cwd(dst_dir)
pwd = ftp.pwd()
assert pwd == dst_dir, f"切换失败,pwd:{pwd}"
# print("当前工作文件夹为", pwd)
def upload_file(path, name):
ftp.storbinary('STOR '+name, open(path, 'rb'), 1024 * 8)
# upload_file('本地文件路径')
print("="*50)
upload_count = 0
ind = 0
errors = []
for name in os.listdir(src_dir):
try:
if name.endswith(file_suffix):
ind += 1
file_path = os.path.join(src_dir, name)
upload_count += 1
upload_file(file_path, name)
print(ind, file_path, end="\r")
shutil.move(file_path, os.path.join(move_dir, name))
except Exception as e:
errors.append((file_path, e))
print("_"*50)
stat_info["上传文件个数"] = upload_count
if errors:
if len(errors) < 10:
stat_info["上传失败"] = errors
else:
with open(err_detail_file_path, 'w', encoding='utf-8') as fw:
for err in errors:
fw.write(str(err))
stat_info["上传失败见"] = err_detail_file_path
print('\n', "success!")
print("*"*50)
for k, v in stat_info.items():
print(" ", k, ":", v)
print("*"*50)
ftp.quit()
创建本地文件夹 D:/share_172.31.227.177.20230720 源文件夹 D:/share ==> 目标文件夹 /data/test/172.31.227.177.20230720 文件上传后,将自动移动到: D:/share_172.31.227.177.20230720 创建文件夹 /data/test/172.31.227.177.20230720 失败, err: 550 Failed to change directory. 切换工作文件夹 /data/test/172.31.227.177.20230720
--------------------------------------------------------------------------- error_perm Traceback (most recent call last) Cell In[41], line 54 51 print("创建文件夹", dst_dir, "失败, err:", e) 53 print("切换工作文件夹", dst_dir) ---> 54 ftp.cwd(dst_dir) 55 pwd = ftp.pwd() 56 assert pwd == dst_dir, f"切换失败,pwd:{pwd}" File d:\Users\Administrator\anaconda3\envs\py39\lib\ftplib.py:625, in FTP.cwd(self, dirname) 623 dirname = '.' # does nothing, but could return error 624 cmd = 'CWD ' + dirname --> 625 return self.voidcmd(cmd) File d:\Users\Administrator\anaconda3\envs\py39\lib\ftplib.py:286, in FTP.voidcmd(self, cmd) 284 """Send a command and expect a response beginning with '2'.""" 285 self.putcmd(cmd) --> 286 return self.voidresp() File d:\Users\Administrator\anaconda3\envs\py39\lib\ftplib.py:259, in FTP.voidresp(self) 257 def voidresp(self): 258 """Expect a response beginning with '2'.""" --> 259 resp = self.getresp() 260 if resp[:1] != '2': 261 raise error_reply(resp) File d:\Users\Administrator\anaconda3\envs\py39\lib\ftplib.py:254, in FTP.getresp(self) 252 raise error_temp(resp) 253 if c == '5': --> 254 raise error_perm(resp) 255 raise error_proto(resp) error_perm: 550 Failed to change directory.