2016-04-14 14 views
1

Ich habe ein Programm, das eine Datei scannt, ich brauche es, um die am häufigsten wiederkehrende Länge einer Zeile zu finden die Linie, die nicht die gleiche Länge wie der Rest hat ... irgendwelche Tipps?Müssen die am meisten wiederkehrende Länge finden, um dann die Zeile zu finden, die nicht die gleiche Länge wie der Rest hat

Ich habe das Gefühl, ich muss meine erste if-Anweisung vollständig ändern. Hier

ist das, was ich bisher ...

import sys 
import os 
import schedule 
import time 


#Using schedule, a continuous loop running every 1 second will monitor the folder "filedrop" 
#defining the "job" that will be done 
def job(): 
#Find any file in the folder "filedrop" with a .txt then scan it 
    for file in os.listdir("/Users/justinstarkman/Desktop/Filedrop/"): 
     if file.endswith(".txt"): 
     #open the file and check to see if it empty 
     #if the file is empty it will be moved to the failure folder with a message why 
     #if the file has contents the scanning will continue 
      with open(file) as f: 
       flenme = os.path.basename(file)   #gets the file name for later 
       cnt= os.stat(file).st_size    #counts the elements in the file 
       try: 
        if cnt > 0: 
         fle = [line.strip() for line in f]   #strips the \n 
         min_char = (min(fle, key = len))   #finds min amount of character 
         max_char = (max(fle, key = len))   #finds max amount of character 
         length_max = len(max_char)     #converts to numbers to compare lengths 
         length_min = len(min_char) 

         #moving files based on is all records are the same length or not 
         if length_max == length_min: 
          os.rename("/Users/justinstarkman/Desktop/Filedrop/{0}".format(flenme) ,"/Users/justinstarkman/Desktop/Filedrop/Success/{0}".format(flenme)) 

         else: 
          os.rename("/Users/justinstarkman/Desktop/Filedrop/{0}".format(flenme) ,"/Users/justinstarkman/Desktop/Filedrop/Failure/{0}".format(flenme))  
          os.chdir("/Users/justinstarkman/Desktop/Filedrop/Failure") #change directory to add to the failed_file document  
          FldFle= open("failed_files.txt","a") 
          FldFle.write('--"%s" was moved to the "Failure" folder.\n' % (flenme)); 
          FldFle.close() 
          os.chdir("/Users/justinstarkman/Desktop/Filedrop") 
        else: 
         os.rename("/Users/justinstarkman/Desktop/Filedrop/{0}".format(flenme) ,"/Users/justinstarkman/Desktop/Filedrop/Failure/{0}".format(flenme)) 
         os.chdir("/Users/justinstarkman/Desktop/Filedrop/Failure")  #change directory to add to the failed_file document  
         FldFle= open("failed_files.txt","a") 
         FldFle.write('--"%s" was moved to the "Failure" folder because it was an empty file.\n' % (flenme)); 
         FldFle.close() 
         os.chdir("/Users/justinstarkman/Desktop/Filedrop") 

       except : 
        print 'ERROR' 
#the program will check the folder for a new file ever 1 second 
schedule.every(1).seconds.do(job) 



while True: 
    schedule.run_pending() 
    time.sleep(1) 
+0

Willkommen bei SO. Sie sollten ein minimales Beispiel, eine Eingabe und die gewünschte Ausgabe geben – Francesco

+0

die Datei, die ich eingeben wird, ist eine TXT, der Prozess wird die Datei erschrecken, um zu sehen, ob alle Längen der Zeilen gleich sind, wenn sie die Datei verschoben werden zu einem Erfolgsordner ... wenn nicht, wird es in einen Fehlerordner verschoben und eine Zeichenkette wird zu einer TXT-Datei hinzugefügt, die besagt, welche Zeile nicht die gleiche Länge wie der Rest hat –

Antwort

0

Für jede Datei, die Sie folgendes tun:

import collections 

line_lengths = [len(line.strip()) for line in f] 

# most common length 
mcl = collections.Counter(line_lengths).most_common(1)[0][0] 

# indexes_of_other_length_lines 
idx = [n for n, v in enumerate(line_lengths) if v != mcl] 

Dies alles, was Sie benötigen sollten, um zu sehen, ob die Datei gültig ist (len(idx) == 0) und was sind die Linien anderer Längen

+0

Also würde dies meine erste if-Anweisung ersetzen? –

+0

Ja, aber Sie müssen den Code an Ihre Bedürfnisse anpassen – Francesco

+0

Ich habe es versucht, aber es sagt alle Zeilen sind 1, auch wenn es mehr als ein Wort in der Zeile, auch wenn es nur ein Wort auf jeder Zeile und eins gibt Ist länger als die andere, druckt es immer noch 1 für alle Zeilen. Zählt diese Methode die Wörter in jeder Zeile oder die Gesamtanzahl der Zeichen in jeder Zeile? –