2017-09-27 3 views
1

J'essaie d'utiliser ftplib pour compter le nombre de lignes dans un fichier. C'est ce que j'ai trouvé jusqu'à présent.Python - obtenir le nombre de lignes d'un fichier via ftp

ftp = FTP('ftp2.xxx.yyy') 
ftp.login(user='xxx', passwd='yyy') 
count = 0 
def countLines(s): 
    nonlocal count 
    count += 1 
    x=str(s).split('\\r') 
    count += len(x) 

ftp.retrbinary('RETR file_name'], countLines) 

Mais le nombre de ligne est désactivée par quelques (je reçois environ 20 plus), Comment puis-je réparer/Est-il une meilleure solution plus simple

+0

Si votre countLines arrive à court, alors vous pouvez essayer de diviser par « \ n » – Uvar

Répondre

2

Vous devez utiliser FTP.retrlines, pas FTP.retrbinary.

count = 0 
def countLines(s): 
    global count 
    count += 1 

ftp.retrlines('RETR file_name', countLines) 

Pour FTP.retrbinary:

La fonction callback est appelée pour chaque bloc de données reçu

Alors que pour FTP.retrlines:

La fonction callback est appelée pour chaque ligne avec un argument de chaîne contenant la ligne avec le CRLF final supprimé.


Avec FTP.retrbinary vous obtenez plus, parce que si un bloc se termine au milieu d'une ligne, cette ligne est compté deux fois.

+0

Impressionnant, je ne peux pas croire je l'ai raté. –

1

Comme suggéré, utiliser FTP.retrlines, mais si vous devez utiliser FTP.retrbinary, vous devrez compter sur ne chaque « \ n », et non à chaque rappel ainsi.

import ftplib 

class FTPLineCounter(object): 

    def __init__(self): 
     self.count = 0 

    def __call__(self, file_text): 
     """Count the lines as the file is received""" 
     self.count += file_text.count(b"\n") 



ftp = ftplib.FTP("localhost") 
ftp.login() 

counter = FTPLineCounter() 

ftp.retrbinary("RETR file_name", counter) 

print(counter.count) 
+0

Vous avez besoin de quelque chose comme 'self.count + = file_text.count (" \ n ")' - Bien que vous manquiez toujours la dernière ligne, si elle n'est pas terminée avec CRLF. –