自动拷贝、上传数字报

  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

posted @ 2021-07-19 16:50  CP喜欢晒太阳  阅读(121)  评论(0)    收藏  举报