2013-11-27 5 views
-2

У меня есть .dat-файл, содержащий более 40 000 строк, содержащих текст и данные. Я хочу извлечь определенные данные из этого файла в следующем виде:Чтение определенных данных из текстового файла

Мне нужен счетчик строк, очевидно, поэтому я знаю, когда дойду до конца файла. Я хочу открыть файл для чтения, а другой для записи и прочитать первую строку. Если строка 2 начинается с первой строки с «Модели», я хочу напечатать пустую строку в открывшемся для записи файле, а затем пропустить две строки вперед в файле. Если две строки позиции из строки открытия не начинаются с «Модели», то я хочу выбрать текст, который занимает 8 позиций из этой первой строки, и распечатать его в файл, открытый для записи. Затем я перемещу 11 позиций из первой строки и так далее.

infile = open("ratios.dat","r") 
outfile = open("corr_ratios.txt","w") 

for aline in infile: 
    items = (aline+2).split() 
    if items[0] = "Model" 
     outfile.write("\n") 
     aline = aline+2 
    else  
     items = aline+8 
     outfile.write(items) 
+0

Для цикла, использующего «алин» в качестве счетчика (может быть, здесь и не так). При чтении файла я разделяю строку так, чтобы элементы первой позиции [0] (где items = aline.split()) проверялись на то, равно ли она «Модель». Если нет, я скопирую данные 8 строк вниз с первого прочитанного и напишу содержимое в другой открытый файл. Я не тестировал его, все на бумаге, так как я пишу это - просто нужны другие программисты-программисты python ... – stars83clouds

+0

Вы должны написать код, который вы написали – jramirez

ответ

2

Файлы питона являются их собственными итераторами и может быть разработан с/передовыми линиями, в то время как так:

with open('path-to-file.txt') as infile: 
    for line in infile: 
    # code here to deal with line. 

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

with open('path-to-file.txt') as infile: 
    for line in infile: 
    if condition: 
     # skip a line 
     next(infile) 

Объединение двух, вы должны быть в состоянии использовать линии, пропустить линии и т.д.

Рассмотрев ваш размещенный код ближе, вы пытаетесь добавить целое число в строку (aline + 2). Для того, чтобы приблизиться к попытке подхода, вы на самом деле сделать что-то вроде этого:

lines = infile.readlines() 
for lineno, line in enumerate(lines): 
    targetline = lines[lineno + 2] 

Этот подход загружает весь файл в память, которая может или не может быть подходящим в зависимости от размера файла.

+0

Я пробовал написать что-то с вашими вышеуказанными предложениями. Однако, видя, что строка по существу является строкой, трудно понять, как вы можете пропустить несколько строк, используя «строку», если у вас не будет индекса целых чисел, который увеличивается каждый раз, когда вы читаете. – stars83clouds

+0

Каждый раз, когда цикл 'for' запускается, вы потребляете одну строку в файле. Каждый раз, когда вы вызываете 'next (infile)', вы потребляете другое. 'for _ в диапазоне (4): next (infile)' пропускает четыре строки. –

+0

Я понимаю это. Тем не менее, я хочу иметь опорную линию, из которой я тестирую значения на некоторых последующих строках (в данном случае две строки впереди). Он основан на содержании последующих строк, которые я делаю следующим шагом, т. Е. 2 ​​пробела или 11 пробелов впереди. Большое спасибо за ваш совет. – stars83clouds

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