首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python从ftp文件夹检索最新文件?

如何使用Python从ftp文件夹检索最新文件?
EN

Stack Overflow用户
提问于 2013-03-26 14:46:50
回答 1查看 1.4K关注 0票数 0

在我的公司,我们有一个天平,可以检查箱子的重量,然后把它们装进卡车。在该箱包含的产品或多或少超出可接受的情况下,该箱被拒绝并交付到另一个传送带。电子天平记录着操作的性能。文件存储在刻度盘中,并从附近的桌面计算机使用ftp访问。我的老板希望这些报告自动发到他的账户上,这样他就不需要去那个机构检查前一天的拒绝情况了。为了做到这一点,我开始用Python编写一个程序,但被塞进了关于从文件夹中检索文件的部分。这是我的代码:

代码语言:javascript
复制
#This program tries to retrieve the latest report and send it by email.
import urllib
import shutil
import ftplib
import os
import sys
import glob
import time
import datetime
import smtplib
import email

#Define the server and folder where the reports are stored.
carpetaftp = "/reports/"

#This function looks for the last file in the folder.
def obtenerultimoarchivo(camino):
    for cur_path, dirnames, filenames in os.walk(camino):
        for filename in filenames:
            datos_archivo = os.stat(filename)
            tiempo_archivo = datos_archivo.st_mtime

#Connects to an ftp folder and downloads the last report.
def descargareporteftp(carpetaftp):
    ftp = ftplib.FTP("server.scale.com")
    ftp.login()
    ftp.cwd(carpetaftp)
    #Uses 'ultimoreporte.pdf' as a copy of the last report.
    archivo = open('C:\\Balanza\\Reportes\\ultimoreporte.pdf',"wb")
    ftp.retrbinary("RETR " + obtenerultimoarchivo(),archivo.write)
    archivo.close()
    return archivo

#The function enviaemail() sends an email with an attachment.
def enviaemail(destinatario, adjunto):
    remitente = "electronic_scale@email.com.uy"
    msg = email.MIMEMultipart()
    msg['From'] = remitente
    msg['To'] = destinatario
    msg['Subject'] = "Ultimo informe de la balanza."
    adjunto = open('C:\\Balanza\\Reportes\\ultimoreporte.pdf', 'rb')
    attach = email.MIMENonMultipart('application', 'pdf')
    payload = base64.b64encode(adjunto.read()).decode('ascii')
    attach.set_payload(payload)
    attach['Content-Transfer-Encoding'] = 'base64'
    adjunto.close()
    attach.add_header('Content-Disposition', 'attachment', filename = 'ultimoreporte.pdf')
    msg.attach(attach)
    server = smtplib.SMTP('smtp.email.com.uy')
    server.login('electronic_scale@email.com.uy', 'thermofischer')
    server.sendmail('electronic_scale@email.com.uy',destinatario, msg.as_string())
    server.quit()


#The main routine, to retrieve the last report and send it by email.
adjunto = descargareporteftp(carpetaftp)
print("Reporte descargado")
enviaemail('myemail@email.com.uy',reporte)
print("Reporte enviado")
EN

回答 1

Stack Overflow用户

发布于 2017-12-14 06:56:27

以下是我犯了一个错误后发现的一种肮脏的方式:

如果在urllib检索命令中没有指定任何文件,它将返回目录中的文件列表(就像ls命令中的那样)。

因此,使用此方法,代码执行以下操作:

  1. 检索FTP文件夹中的文件列表并在本地保存文件
  2. 读取文件并找到列表中的最后一个条目
  3. 从FTP文件夹中检索最后一个文件 导入urllib def检索(地址,输出):#在这里运行ftp检索命令urllib.urlretrieve(地址,(输出)#刷新urllib,以便我们可以下载第二个文件urllib.urlcleanup() def ():#让我们在这里构建ftp地址: usr = "usrname“psswrd = "password”host = "host.com“path = "/foo/bar/”list_file =“list_file=”list_file% (usr,psswrd,host,(路径)打印“获取文件列表:”+ address #检索列表检索(地址,list_file) #将文本文件读取为一行#查找最后一行,更改为list_file_reader = open ( ' list ',"r“) lineList = list_file_reader.readlines() last_file =lineList-1.拆分(‘')-1:.rstrip()输出=’wanted_file.dat‘地址=’wanted_file.dat% (usr,psswrd,host,path,last_file) #检索实际要检索的文件(地址、输出)打印地址main()

这当然不是最有效的方法,但在我的场景中有效。

参考文献:

Python: download a file over an FTP server

https://www.daniweb.com/programming/software-development/threads/24544/how-do-i-read-the-last-line-of-a-text-file

Downloading second file from ftp fails

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15640003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档