Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 9, 2013 02:01:01

rivawi
Зарегистрирован: 2012-10-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с двумя файлами одновременно

Имеется два файла, один вида

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)

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

Офлайн

#2 Янв. 9, 2013 03:15:16

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с двумя файлами одновременно

все смешалось, и кони и пони…

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

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

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

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

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Янв. 9, 2013 12:17:04

rivawi
Зарегистрирован: 2012-10-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с двумя файлами одновременно

теперь он скидывает нужную строку, но только первую…

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)

Офлайн

#4 Янв. 9, 2013 23:11:53

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Работа с двумя файлами одновременно

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()



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Янв. 10, 2013 02:13:13

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Работа с двумя файлами одновременно

Вот здесь ТС более подробно описал то, что он хочет. Судя по всему “второй файл” несколько больше “первого”, к тому же есть условие, по которому часть ключей можно отбросить, поэтому в память лучше грузить “первый” файл, ИМХО.



Офлайн

#6 Янв. 10, 2013 19:38:08

rivawi
Зарегистрирован: 2012-10-30
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с двумя файлами одновременно

Большое спасибо за пояснения

Вот такая конструкция все замечательно посчитала, отдельное спасибо 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)

Офлайн

#7 Янв. 11, 2013 01:28:54

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Работа с двумя файлами одновременно

rivawi
f1.close ()
fin.close ()
fout.close ()
Это лишнее.



Отредактировано pyuser (Янв. 11, 2013 01:29:51)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version