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.