import android from ftplib import FTP import bisect droid = android.Android() a_path = '2a.txt' a_user = 'ne01026' if False : unicode ( '\xd4' ) # .decode ('latin1') if False: an_out = open ('2a.txt', 'w') FTP ('MAIL.2A.PL', a_user, '*') .dir ('-R', lambda (l) : an_out .write (l + '\n')) else: an_in = open (a_path) l_rec = [] # size, name, parent, first an_entry = [0, '', -01, -01] while True : # read all directories if False : print '@' a_line = an_in .readline () .split () if len ( a_line ) == 02 and a_line [0] == 'total' and int ( a_line [1] ) >= 0 : while True : # read the entries of the current directory a_line = an_in .readline () if len (a_line) <= 01 : break for a_fno in range (0, 010) : # break the entry into fields while True : # find the next field an_end = a_line .index (' ') if an_end == 0 : a_line = a_line [01 : ] else : break a_field = a_line [0 : an_end] if a_fno < 02: if a_fno < 01 : if a_fno == 0 : assert an_end == 012 elif a_fno == 01 : assert int (a_field) > 0 elif a_fno == 02 : assert a_field == a_user elif a_fno == 04 : an_entry [0] = int (a_field) assert ( an_entry [0] >= 0) a_dir = an_entry [02] while a_dir >= 0 : l_rec [a_dir * len (an_entry)] += an_entry [0] a_dir = l_rec [a_dir * len (an_entry) + 02] if False : print a_field a_line = a_line [an_end + 01 : ] if a_line [ -01 ] == '\n' : an_entry [01] = a_line [: -01 ] l_rec += an_entry assert ( len (l_rec) == len (an_entry) or l_rec [-02 - len (an_entry)] != l_rec [-02] or l_rec [-03 - len (an_entry)] < l_rec [-03]) if False : print an_entry [0], unicode ( an_entry [01] , 'latin1' ) .encode ('utf8') a_line = an_in .readline () print a_line if (len (a_line) > 04 and a_line [ : 02] == './' and a_line [-02 : ] == ':\n') : l_path = a_line [02 : -02] .split ('/') if True or l_rec [-02] != -01 : # find a near folder different from the 1st one an_entry [02] = -01 for a_name in l_path : # find the directory corresponding to the name if False : print a_name if an_entry [02] == -01 : a_beg = 02 else : a_beg = l_rec [an_entry [02] * len (an_entry) + 03] + 02 assert ( a_beg > 02 and l_rec [a_beg] == an_entry [02] and l_rec [a_beg - len (an_entry)] != an_entry [02]) a_diff = len (an_entry) an_end = a_beg while True : a_mid = an_end an_end = a_beg + a_diff if an_end >= len (l_rec) : an_end = len (l_rec) + 02 break if l_rec [an_end] != l_rec [a_beg] : break a_diff <<= 01 assert a_mid >= a_beg and an_end >= a_mid and l_rec [a_mid] == an_entry [02] while True : a_sum = a_mid + an_end >> 01 if a_sum & 02 == 0 : a_sum -= 02 if a_sum == a_mid : break if l_rec [a_sum] == an_entry [02] : a_mid = a_sum else : an_end = a_sum an_entry [02] = ( a_beg / len (an_entry) + bisect .bisect_left (l_rec [a_beg - 01 : an_end - 01 : len (an_entry)], a_name)) assert l_rec [an_entry [02] * len (an_entry) + 01] == a_name if False : print a_name, an_entry [02] l_rec [an_entry [02] * len (an_entry)+ 03] = len (l_rec) an_entry [01] = '' else : break for an_ix in sorted ( range (len (l_rec) / len (an_entry)), lambda x, y : cmp (l_rec [x * len (an_entry)], l_rec [y * len (an_entry)])) : print l_rec [an_ix * len (an_entry) : an_ix * len (an_entry) + 03] raw_input ()