社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

ryguy72 • 5 年前 • 1266 次点击  

昨天,我请求帮助编写一个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
 
1266 次点击  
文章 [ 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()