Форум сайта python.su
0
Имеется два файла, один вида
name1, number1
name2, number2
name3, number3
и т.д.
в строках другого содержатся name1/2/3…
задача - если число (второй столбец первого файла; number) больше определенного значения, найти строку содержащую участок из первого столбца первого файла (name) и скопировать в третий файл…
было написано следующее
for number, line in enumerate(f1.readlines()): A = line[0:14] B = line [16:24] if (float(B)>0.1): open(f2, 'r+') f2.readlines() line.find(A) f3.write(line)
Офлайн
221
все смешалось, и кони и пони…
1) не рекомендую выделять в строке числа путем жесткого индексирования, лучше это делать через line.split() естественно подобрав нужный вам разделитель
2) открывать файл внутри цикла неправильно. Тем более постоянно считывая все его содержимое. Нужно вынести за пределы цикла. К тому же вы считываете явно не верно.
3) Вы не присваиваете никакой переменной получаемые значения - бессмысленный код
>>f2.readlines()
>> line.find(A)
4) line.find(A) - из контекста азадачи и кода выше вы просто напросто делаете не то что вам нужно. Прочитайте для чего нужен метод find
Тут все нужно переделывать.
Возьмите книгу Чаплыгина и уделите день времени ее изучению. Вам поможет
Офлайн
0
теперь он скидывает нужную строку, но только первую…
for number, line in enumerate(f2.readlines()): D=line.split(";") A=D[0] B=D[1] if (float(B)>0.1): for lino, line in enumerate(f3.readlines()): if A in line: f1.write(line)
Отредактировано rivawi (Янв. 9, 2013 12:27:58)
Офлайн
221
rivawi
Чувствуется вы просто код не весь выложили , а проблема там. Ну и судя по всему, вы меня не “услышали”. Поэтому расписываю подробно.
def do_it(): # Открываем первый файл с данными f_input_1=open('file1.txt') # ЧТо бы в цикле постоянно не опрашивать файл, считаем его данные заранее - экономия на операциях ввода/вывода. # Это при условии что файл не весит натсолько много что бы занимать всю ОЗУ, иначе нужен другой подход. data=open('file2.txt').readlines() # Открываем файл в который будем писать результаты f_out=open('file3.txt', 'w') # Здесь мы не используем readlines() так как не нужно заранее иметь весь массив данных в памяти, а лучше спокойно пройтись по файлу в цикле. # не используем enumerate() так как счетчик строк не понадобился. for line in f_input_1: D=line.split(";") A=D[0] B=D[1] if float(B)>0.1: for line in data: if A in line: f_out.write(line) # Явным образом закрываем файлы - просто пример хорошего тона f_input_1.close() f_out.close()
Офлайн
36
Вот здесь ТС более подробно описал то, что он хочет. Судя по всему “второй файл” несколько больше “первого”, к тому же есть условие, по которому часть ключей можно отбросить, поэтому в память лучше грузить “первый” файл, ИМХО.
Офлайн
0
Большое спасибо за пояснения 
Вот такая конструкция все замечательно посчитала, отдельное спасибо pyuser(хотя полагаю если файлики будут поболе чем 40-50 мб, понадобиться ускорить процесс)
import csv import string os.chdir('E:/DATA/') N = raw_input('name of file = ? ') with open("key.csv", "rt") as f1: keyReader = csv.reader(f1, delimiter=";", skipinitialspace=True) keys = [r[0] for r in keyReader if float(r[1]) > 0.1] with open(N, "rt") as fin, \ open("10.log", "wt") as fout: for line in fin: for key in keys: if key in line: fout.write(line) break f1.close () fin.close () fout.close () print 'Job done'
Отредактировано rivawi (Янв. 11, 2013 00:30:34)
Офлайн
36
rivawiЭто лишнее.f1.close () fin.close () fout.close ()
Отредактировано pyuser (Янв. 11, 2013 01:29:51)
Офлайн