2014-09-14 3 views
0

Я хотел бы проанализировать данные с помощью «tab delimited» и хотел бы заменить определенную строку в данных.Форматирование данных с использованием python

входного файла: VI foo.txt:

Bob lives in%3a Boston 
Sam lives in Houston 
Jay  lives in Ruston 
Bill  lives in   Atlanta 

Это то, что я придумал: VI foo.py:

import re 

fin = open("foo.txt") 
fout = open("bar.txt", "w") 
for line in fin.readlines(): 
    fout.write('\t'.join(line.split())+'\n') # parse data with tab delimited 

for line in fin.readlines(): 
    fout.write(re.sub('%3a',':',line)) # substitute string with regex 

VI bar.txt:

Bob lives in%3a Boston 
Sam lives in Houston 
Jay lives in Ruston 
Bill lives in Atlanta 

Почему% 3a все еще находится на выходе, а не ':'?

Спасибо,

Rio

+1

Я не знаю, что вы хотите сделать с 2-мя петли, но вам нужно сбросить указатель на файл перед вторым циклом с 'fin.seek (0) ', тогда вы увидите 8 строк вместо 4 - у первого набора будет'% 3a', а у второго будет ':' – karthikr

ответ

3

readlines() итератор. Как только вы его потребляете - этого больше нет. Вы потребляете его при первом вызове for line in fin.readlines():. Во втором звонке - больше нечего перебирать, так что эта строка: fout.write(re.sub('%3a',':',line)) никогда не вызывается.

Даже если бы это было так - это создало бы две копии входных данных на выходе - одну вкладку разделили, но с %3a, а одну не разделили табуляцию, но без %3a.

Что вы хотите сделать это:

for line in fin.readlines(): 
    fout.write('\t'.join(re.sub('%3a',':',line).split())+'\n') 
+0

. Я не видел, чтобы он дважды назывался 'readlines()'. Ваш ответ правильный. И, кстати, 're' слишком тяжел для простой замены строки в его случае. – stanleyxu2005

+0

Спасибо! Как я могу достичь этого с помощью двух циклов, как я пытался раньше? Я хочу, чтобы код был более читабельным, и у меня много строк для замены. – Rio

+0

@ stanleyxu2005 Это может быть правдой, но это не является воплощением проблем с его кодом. – Korem

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