2016-11-03 4 views
1

, поэтому я пытаюсь пропустить несколько строк из TXT-файла и затем создать файл CSV с помощью csv-reader. Необходимо пропустить 18 строк. Это выполняется, но я уверен, что есть простой способ пропускать 18 строк вместо использования следующего() 18 раз.Пропустить несколько строк в Python

import csv 
import os 

my_file_name = os.path.abspath('LensBank.txt') 
cleaned_file = "LensBankClean.csv" 
with open(my_file_name, 'r', newline='') as infile, open(cleaned_file, 'w',newline='') as outfile: 
    writer = csv.writer(outfile) 
    cr = csv.reader(infile, delimiter=',') 

    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    next(cr) 
    writer.writerow(next(cr)) 

    for line in (r[:20] for r in cr): 
    writer.writerow(line) 

Это работает для меня, но как бы очистить код до гораздо более простой версии. Благодаря!

ответ

3

Применение :

for skip in range(18): 
    next(cr) 
+0

... и это можно сделать на 'infile' перед созданием' csv.reader', чтобы сохранить несколько циклов процессора. – tdelaney

1
for i in range(18): 
    next(cr) 

Используйте for цикл. Или вы можете использовать itertools.dropwhile

for line in (r[:20] for i, r in itertools.dropwhile(lambda x: x[1] < 18 , enumerate(cr))): 
1

Это странно, что вы использовали для цикла ниже, но не считали для одной и той же задачи.

ваш код может быть легко заменен на что-то вроде этого

for i in range(18): 
    next(cr) 
writer.writerow(next(cr)) 

Это будет вызывать следующие (CR) в 18 раз, а потом позвонить writer.writerow

1

Как об этом,

import csv 

# read a csv file into a list of lists 
with open(in_file, 'r') as f_in: 
    lists = [row for row in csv.reader(f_in, delimiter=',')] 

# write a list of lists to a csv file 
with open(out_file, 'w') as f_out: 
    writer = csv.writer(f_out) 
    writer.writerows(lists[18:]) # skip the first 18 lines 

Как уже упоминалось @PatrickHaugh, вышеупомянутое решение недействительно для большого файла. Ниже приведено решение для больших файлов.

with open(in_file,'r') as f_in, open(out_file,'w') as f_out: 
    # skip the first n lines 
    for _ in range(18): 
     next(f_in) 
    for line in f_in: 
     f_out.write(line) 
+1

Это хорошее решение для небольших файлов, но для очень больших я чувствую, что чтение всего этого в память плохое. Я был бы очень осторожен в этом, не будучи очень уверенным в моих вкладах. –

+0

@PatrickHaugh, Thx. Согласен. Я только что обновил свой ответ. – SparkAndShine

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