2015-06-12 4 views
0

У меня есть файл, который я загружаю через FTP. Это очень большой файл, поэтому я хочу только получить первое сообщение, 20 строк для работы с ним прямо сейчас. Я хочу записать эти 20 строк в новый файл на моем локальном компьютере. В этом процессе я хочу совместить значение в строке.Получить первые x строк из файла и совпадение на подстроке

Файл является труба с разделителями и начало каждой строки выглядит следующим образом:

9999-12-31 | XX | ...

Я хочу писать только в выходной файл, когда значение этого второго поля равно XX, иначе проигнорируйте его.

Вот основы моего кода:

def writeline(line): 
    file.write(line + "\n") 

file = open(localDir + fileName, "w+") 
ftp.retrlines("RETR '" + remotePath + "'", writeline) 

Все этот код работает нормально, чтобы загрузить файл, если я хочу, чтобы вывести весь файл. Я попытался поместить цикл while в мою функцию writeline, но он просто напишет каждую строку количество раз, указанное в моем цикле, что имеет смысл в ретроспективе. Кажется, что цикл while должен быть каким-то образом в функции retrlines.

Я довольно новичок в Python, поэтому я ценю любую помощь, которую вы можете предоставить, и за ваше терпение с моим вопросом noob.

Update Хорошо, это похоже на матч на подстроки, я могу сделать:

line[11:13] 

, но это все еще оставляет меня с проблемой пытаются получить только первые х линий для работы с ,

+0

Вы можете попробовать использовать itertools.islice в функции обратного вызова –

+0

Должно ли это быть частью более крупной программы. Я хотел бы просто использовать awk для этого, а не для python, для чего он создан. Вероятно, это было бы так: '' awk -F | {if (NR <21) {print $ 2}}> new_file.txt''' Возможно, вы можете открыть канал для файла для подачи awk, чтобы вы не располагали его локально, учитывая, что вы указываете размер , – dave

ответ

-1

Попробуйте открыть файл в другой стороне, что-то вроде:

def writeline(i,line): 
    if line[11:13] == 'XX': 
     file.write(line + "\n") 
     i+=1 
    return i 

file_ = open(localDir + fileName).read.splitlines() 
i = 0 
while i < 20: 
    i = writeline(file_[i]) 
0

Я вы хотите работать на весь файл, здесь функции для фильтрации файлов и записи в другой в соответствии с рисунком фильтра:

def get(f, pattern="XX", index=1, sep="|", max=100): 
    c = 0 
    with open(f) as in_: 
     for line in in_: 
      if line.split(sep)[index] == pattern: 
       c += 1 
       yield line 
       if c == max: 
        return 

def set(outf, inf): 
    with open(outf, "w") as out: 
     for l in get(inf): 
      out.write(l) 

set("out.txt", f) 
-1

Никогда не пробовал это раньше, но использование ftp.abort() должно иметь возможность прекратить передачу данных.

Быстрый макете, не проверял, как я хотел бы сделать это:

counter = 0 

def writeline(line): 
    if 'XX' in line.split('|') and counter < 20: 
     with open(filename, 'a') as f: 
      f.write(line += "\n") 
      counter += 1 
    if counter == 20: 
     ftp.abort() 

ftp.retrlines("RETR '" + remotePath + "'", writeline) 

Хотя вид кажется некрасиво всегда повторном открытии файла в функции WriteLine. С другой стороны, он гарантирует, что файл правильно закрыт, что может быть забыто через некоторое время и вызывать проблемы, если вы неправильно его обрабатываете.

Смежные вопросы