Py学习  »  Python

尝试运行python脚本来清点ftp门户

ryguy72 • 5 年前 • 1291 次点击  

昨天,我请求帮助编写一个python脚本来遍历文件夹,检查每个文件夹的内容,并打印出一份报告,其中包含这些文件夹中文件的一些基本统计信息。martin prikryl给我指出了几个月前他开发的一些代码的方向。我试过了,没有任何错误,但也没有任何结果。这是密码。

from ftplib import *
global ftp
import ftplib
import io
from io import StringIO
import string
import pandas as pd
from pandas.compat import StringIO
from collections import Counter

from ssl import SSLSocket

class FtpFile:

    def __init__(self, ftp, name):
        self.ftp = ftp
        self.name = name
        self.size = ftp.size(name)
        self.pos = 0

    def seek(self, offset, whence):
        if whence == 0:
            self.pos = offset
        if whence == 1:
            self.pos += offset
        if whence == 2:
            self.pos = self.size + offset
        print("seek {}".format(self.pos))

    def tell(self):
        print("tell {}".format(self.pos))
        return self.pos

    def read(self, size = None):
        if size == None:
            size = self.size - self.pos
        print("read {}".format(size))
        data = ""

        # based on FTP.retrbinary 
        # (but allows stopping after certain number of bytes read)
        ftp.voidcmd('TYPE I')
        cmd = "RETR {}".format(self.name)
        conn = ftp.transfercmd(cmd, self.pos)
        try:
            while len(data) < size:
                buf = conn.recv(min(size - len(data), 8192))
                if not buf:
                    break
                data += buf
            # shutdown ssl layer (can be removed if not using TLS/SSL)
            if SSLSocket is not None and isinstance(conn, SSLSocket):
                conn.unwrap()
        finally:
            conn.close()
        ftp.voidresp()
        print("read {}".format(len(data)))
        return data

# And then you can use it like:
ftp = FTP(portal, user_name, password)
ftp.cwd('/emm/') # folder that I'm trying to query

zipstring = StringIO()
print(zipstring)
name = "C:/Users/ryans/OneDrive/Desktop/archive.zip"
print(name)
size = ftp.size(name)
print(size)
ftp.retrbinary("RETR " + name, zipstring.write, rest = size - 1000*2024)

zip = zipfile.ZipFile(zipstring)

print(zip.namelist())

我希望结果会在某个地方打印出来,或者是文本文件,或者是csv文件,但是我没有看到任何打印出来的东西。而且,代码运行得非常,非常慢,而且从未真正完成。 再说一次,我在任何地方都看不到任何结果。我看到的ftp门户大约是7.6gb,它有705个文件夹和文件。我想要获取文件名,添加/更改文件的日期,每个文件的大小,如果可能的话,每个文件中的记录计数。也许最后一件事太难做了。我认为其他的事情是可行的。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43364
 
1291 次点击  
文章 [ 1 ]  |  最新文章 5 年前
ryguy72
Reply   •   1 楼
ryguy72    6 年前

我整理了一些代码,看起来工作得很好。我相信这是可以改进的,但现在,它已经足够好了。

import ftplib
import datetime 
from datetime import datetime 

ftp = ftplib.FTP('ftp_portal', 'user_name', 'password')  

ftp.cwd('folder_of_interest')
ftp.retrlines('LIST')  

filenames = []  
ftp.retrlines('NLST', filenames.append)  

# writes file name and modified date and file size.
with open('C:\\path_to_file\\test.txt', 'w')  as f:
    for filename in filenames:  
        datetimeftp = ftp.sendcmd('MDTM ' + filename)
        modifiedTimeFtp = datetime.strptime(datetimeftp[4:], "%Y%m%d%H%M%S").strftime("%d %b %Y %H:%M:%S")
        size = ftp.size(filename)
        filesize = "{:.2f}".format(size/(1024))
        f.write(filename)
        f.write(':')
        f.write(modifiedTimeFtp)
        f.write(':')
        f.write(filesize + ' KB')
        f.write('\n')
f.close()