自动拷贝、上传数字报
1 # -*- encoding=utf-8 -*- 2 from ftplib import FTP 3 import os 4 import subprocess 5 import time 6 import datetime 7 from progressbar import ProgressBar 8 import logging 9 10 11 logging.basicConfig(level=logging.INFO, 12 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') 13 # logger = logging.getLogger(__name__) 14 15 ROOT = '/' 16 17 ftp = FTP() # FTP对象 18 ftp.encoding = 'utf-8' # 解决中文乱码问题 19 20 21 def connect():# 连接ftp 22 try: 23 ftp.connect("x.x.x.x", 21) # ip/port 24 logging.info('Connection ftp success') 25 except Exception as e: 26 logging.error('Connection ftp fail:{}'.format(e)) 27 28 29 def login(): 30 try: 31 ftp.login("xx", "xx") # 连接的用户名,密码 32 logging.info('Login ftp success') 33 except Exception as e: 34 logging.error('Login ftp fail:{}'.format(e)) 35 36 37 def cwd_root(): 38 try: 39 ftp.cwd('/') # 切换到根目录 40 logging.info('Cd ftp root success') 41 except Exception as e: 42 logging.error('Cd ftp root fail:{}'.format(e)) 43 44 45 def cwd(path, relative=''): 46 47 if relative.upper() == ROOT: 48 cwd_root() 49 try: 50 ftp.cwd(path) # 切换到任意目录 51 logging.info('Cd ftp dir success:{}'.format(path)) 52 return True 53 except Exception as e: 54 logging.error('Cd ftp dir fail:{}'.format(e)) 55 return False 56 57 58 def pwd(): 59 current_dir = '' 60 try: 61 current_dir = ftp.pwd() # 获取当前的目录 62 logging.info('Get ftp current dir success:{}'.format(current_dir)) 63 except Exception as e: 64 logging.error('Get ftp current dir fail:{}'.format(e)) 65 return current_dir 66 67 68 def close(): 69 try: 70 ftp.close() # 关闭 71 logging.info('Close ftp success') 72 except Exception as e: 73 logging.error('Close ftp fail:{}'.format(e)) 74 75 76 def create_folder(folder): 77 folder = os.path.abspath(folder) 78 if not os.path.exists(folder): 79 try: 80 os.makedirs(folder) 81 logging.info('Create folder success:{}'.format(folder)) 82 except Exception as e: 83 logging.error('Create folder fail:{}'.format(e)) 84 85 86 def down_file(ftp_file, save_local_path): 87 # print(save_local_path, 33333) 88 success = False 89 abs_path = os.path.abspath(save_local_path) 90 # print(abs_path, 11) 91 92 path = os.path.dirname(save_local_path) 93 94 # print(path, 22) 95 create_folder(path) 96 try: 97 with open(abs_path, 'wb') as f: 98 ret = ftp.retrbinary('RETR ' + ftp_file, f.write) # 下载文件 99 # logging.info('Down ftp file return:{}'.format(ret)) 100 if ret.startswith('226'): 101 logging.info( 102 'Down ftp file success, save to:{}'.format(abs_path)) 103 success = True 104 except Exception as e: 105 logging.error('Down ftp file fail:{}'.format(e)) 106 logging.error('Fail path:{}'.format(ftp_file)) 107 success = False 108 return success 109 110 111 def get_dir_and_files(ftp_path): 112 # 获取路径的文件夹和文件 113 path_info = [] 114 folder = [] 115 files = [] 116 try: 117 ftp.dir(ftp_path, path_info.append) 118 except Exception as e: 119 logging.error('Get ftp dir fail:{}'.format(e)) 120 logging.error('Fail path:{}'.format(ftp_path)) 121 122 for path in path_info: 123 path = path.strip() 124 filename = ftp_path + '/'+path.split(':')[1][3:] 125 # print(filename) 126 if path.startswith('-'): 127 files.append(filename) 128 elif path.startswith('d'): 129 folder.append(filename) 130 else: 131 logging.error( 132 'Can not tell whether it is a folder or a file:{}'.format(path)) 133 return folder, files 134 135 136 def down_folder(ftp_path, local_path): 137 # 下载文件夹 138 local_path = os.path.abspath(local_path) 139 # print(localpath, 444) 140 dirs, all_file = get_dir_and_files(ftp_path) 141 for one_dir in dirs: 142 down_folder(one_dir, local_path) 143 for one_file in all_file: 144 save_path = local_path + '/' + str(one_file).lstrip('/xxx') 145 # print(save_path,55555555555) 146 down_file(one_file, save_path) 147 148 149 flag = 0 150 151 connect() 152 login() 153 cwd('xxx') 154 localpath = 'D:\szbxml\src' 155 catalog = str(datetime.date.today()) # 当天日期为名称的目录 例 2021-7-12 156 result = cwd(catalog) 157 if result: 158 directory = pwd() 159 get_dir_and_files(directory) 160 down_folder(directory, localpath) 161 print('下载完成') 162 flag = 1 163 else: 164 print('未获取到今日文件夹!') 165 166 167 ftp.close() 168 169 170 if flag: 171 os.chdir('C:\\Users\\Administrator\\Desktop\\upload\\paper') 172 173 p = subprocess.Popen( 174 'C:\\Users\\Administrator\\Desktop\\upload\\paper\\start.bat') 175 176 time.sleep(300) 177 p.kill()
继爬取数字报后,又有一个新任务,每天早上来上传数字报:把当天文件从ftp服务器上拷到本地目录,运行上传程序,等待完成。整个过程其实非常简单,但是有点繁琐,而且受制于网络的原因,只能在办公室的机器上操作。每天就必须为了这个事情早去,实在是浪费。
有了之前爬虫的经验,python的操作捡回来一些。首先要解决ftp问题,了解到python有自己ftp包,又在网上搜了一下,有个博客写好了自己的ftp类,我借鉴了他的,但是换成了函数,我感觉我这个脚本用函数更适合。ftp的连接,切换目录,引入了logging模块,打印日志确实看着很清晰。最关键的是拷贝,首先利用datetime模块构造路径,可以顺利cd到当天文件夹。接着是下载,一开始以为ftp只能下载文件,文件夹是个问题。接着看到博主的遍历思路,精彩。最难的部分被攻克了,剩下就是在本地创建文件夹,这里按照原先的代码会在路径加上根目录,用strip去除一下就好。
完成了从ftp到本地文件夹的拷贝,大头。接着是运行bat脚本(java语言),一开始用的是os.system(),但是各种报错,什么不是内部命令,搞得重新下载了jdk和jre。这次报了“找不到或无法加载主类”,后来看了一些解答,加上了os.chdir(),切换到脚本所在目录,可以了。
到此程序就基本完成了所有功能,但是脚本打开后无法关闭,试了好几个办法都不行。后来用了subprocess.Popen(),开线程。讲道理应该是好一些,但还是解决不了问题,就这样吧,py代码部分就是这些。
最后是自动开机,网上的答案不靠谱呀,说是定时任务里添加 startup命令,第二天来没开机。后来去Bios设置里找到了定时开机,开机后定时执行py程序,一气呵成。早上可以晚点去了,同事都非常惊讶,电脑自动完成了上传。再次靠python大大简化了工作,yyds。
https://www.cnblogs.com/lyon2014/p/4565976.html
https://www.cnblogs.com/rainbow-tan/p/13998528.html

浙公网安备 33010602011771号