Найти - Пользователи
Полная версия: Работа с двумя файлами одновременно
Начало » Python для новичков » Работа с двумя файлами одновременно
1
rivawi
Имеется два файла, один вида

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)

эта конструкция записывает строку из первого файла, а не из второго…
соответственно вопрос - что я делаю не так?
JOHN_16
все смешалось, и кони и пони…

1) не рекомендую выделять в строке числа путем жесткого индексирования, лучше это делать через line.split() естественно подобрав нужный вам разделитель

2) открывать файл внутри цикла неправильно. Тем более постоянно считывая все его содержимое. Нужно вынести за пределы цикла. К тому же вы считываете явно не верно.

3) Вы не присваиваете никакой переменной получаемые значения - бессмысленный код
>>f2.readlines()
>> line.find(A)

4) line.find(A) - из контекста азадачи и кода выше вы просто напросто делаете не то что вам нужно. Прочитайте для чего нужен метод find

Тут все нужно переделывать.
Возьмите книгу Чаплыгина и уделите день времени ее изучению. Вам поможет
rivawi
теперь он скидывает нужную строку, но только первую…

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)
JOHN_16
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()
pyuser
Вот здесь ТС более подробно описал то, что он хочет. Судя по всему “второй файл” несколько больше “первого”, к тому же есть условие, по которому часть ключей можно отбросить, поэтому в память лучше грузить “первый” файл, ИМХО.
rivawi
Большое спасибо за пояснения

Вот такая конструкция все замечательно посчитала, отдельное спасибо 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'
pyuser
rivawi
f1.close ()
fin.close ()
fout.close ()
Это лишнее.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB