Найти - Пользователи
Полная версия: Колонка из чисел, нахождение интервалов, поиск в другом файле и запись в новом файле
Начало » Python для новичков » Колонка из чисел, нахождение интервалов, поиск в другом файле и запись в новом файле
1 2
whoami217
Доброго времени суток!
Очень сложная задачка, которую я не могу реализовать. Есть файл 2.txt, и много файлов от text_1.xls до text_M.xls. Нужно написать код, который выполняет следующие пункты задачи:
1. открываем файлы 2.txt, и сначала text_1.xls
2. ищем колонку t из файла 2.txt
3. берем для начала первое число из этой колонки
4. округляем его до десятых в меньшую сторону
5. ищем колонку Ttt из text_1.xls
6. смотрим не попадается ли это первое число в интервале чисел из колонки Ttt
7. если попадается, то смотрим в этой строчке, какому числу из колонки Bm равно числу N , которое соответствует этому времени. Запоминаем это число, так как в дальнейшем это число пригодится.
если не попадается, то открываем следующий по нумерации файл text_2.xls. проделываем такие же операции, какие указаны в пунктах: 5), 6) и 7) и т.д.
8. В зависимости от числа N из колонки Bm выбираем поля с названиями: X_1, …, X_N и Z_1, …, Z_N, также берем под этими полями строчку, которая соответствует этому времени, и вставляем всё это в новый файл out_1.xls. Если это число N из колонки Bm равно 0, то эту строчку не записываем в файл.
9. Если число отличное от 0, то в файл out_1.xls записываем поля №, t, Bm, X_1, …, X_N, Z_1, …, Z_N, C и под этими полями строчку, которая соответствует этому времени из файла 2.txt.
10. тоже самое проделывается с остальными числами из колонки t файла 2.txt

Несколько файлов для примера прикреплены (в архиве), чтобы можно было разобраться, если какие-то пункты задачи неясны. Данные собраны ручным способом.
py.user.next
whoami217
Очень сложная задачка, которую я не могу реализовать.
Вот тоже интересно, потянет ли её vic57 .
Короче, кто функции не применяет, тот потом в такую ловушку и попадает.
vic57
py.user.next
Вот тоже интересно, потянет ли её vic57 .
у админов баз данных есть такая поговорка - чем сложнее надо делать запрос, тем тупее был разработчик
алгоритм такой - преобразовать в csv, csv преобразовать в словарь типа
key:[val1,val2,...]
и делать поиск по словарям. реализовывать мне лениво, поскольку ТЗ расписано мутно
нету тела кода - нету дела ответа
whoami217
vic57, вероятно мне стоило бы более подробно описать задачу. Но мне вручили этот архив с кучей файлов без подробных (да ни то что без подробных, даже без каких-либо) пояснений и попросили автоматизировать. Просмотрев архив, я сообразила, что можно так разбить на подзадачи.
vic57
whoami217
есть файл типа csv
читаем и преобразуем в словарь(dict)
 data='''key0,key1,key2
00,01,02
10,11,12
20,21,22
'''
lst = [i.split(',') for i in data.split('\n') if i.strip()]
out = [[] for i in range(len(lst[0]))]
#print out
for i in lst:
    for j in xrange(len(i)):
       out[j].append(i[j])
#print out
In = {}
for i in out:
    In[i[0]] = [float(j) for j in i[1:]]
print In
получаете структуру типа ключ:массив значений
почитайте про dict
все у вас получится, я в вас верю
ЗЫ не торопитесь сразу что-то писать в файл, сформируете выходной массив, тогда и запишете
ЗЗЫ если данных много, может в лучше БД преобразовать?
py.user.next
whoami217
Но мне вручили этот архив с кучей файлов без подробных (да ни то что без подробных, даже без каких-либо) пояснений и попросили автоматизировать.
Странно. Если не шаришь, зачем давать такие задания? Может, уволить хотят или отчислить. У нас такое практиковалось в институте: когда хотели отчислить, сначала удерживали на слабом уровне (ставили оценки без сдачи), а потом резко давали какое-нибудь сложное задание и в больших объёмах, на неделю. Человек начинал бегать (паниковать) и попадался в ловушку, когда шёл делать это на заказ, ничего в этом не понимая. И когда делал, ему давали ещё, чтобы утопить окончательно. Так поотчисляли некоторых, которые думали (наивно полагали), что через взятки смогут до конца учиться, ничего не делая и ничего не понимая. А для института это был вопрос репутации, поэтому взятки-то они брали, но до конца старались никого не доводить из таких. Многие пропёрлись, так как думали, что до конца так будут учиться.

vic57
поскольку ТЗ расписано мутно
Она его сама сгенерила. А надо было послать нахрен этого задавальщика.
vic57
py.user.next, с людями надо мягше
whoami217
для лучшего понимания
 #!/usr/bin/env python2
#coding:utf-8
def fileToDict(fname,delim=None,endline='\r\n'):
    with open(fname) as f:
        lines = f.read().split(endline)
    lst = []
    for line in lines:
        tmp = [i.strip() for i in line.split(delim) if i.strip()]
        lst.append(tmp)
    out = [[] for i in xrange(len(lst[0]))]
    for i in lst:
           for j in xrange(len(i)):
               out[j].append(i[j])
    d = {}
    for i in out: d[i[0]] = [round(float(j),1) for j in i[1:]]
    return d
    
d1 = fileToDict('2.txt','\t')
d2 = fileToDict('text_1.csv',';')
#2. ищем колонку t из файла 2.txt
#3. берем для начала первое число из этой колонки
t = d1['t'][0]
#5. ищем колонку Ttt из text_1.xls
Ttt = d2['Ttt']
#6. смотрим не попадается ли это первое число в интервале чисел из колонки Ttt
#7. если попадается, то смотрим в этой строчке, 
#   какому числу из колонки Bm равно числу N , которое соответствует этому времени. 
#? тут я что-то не въехал
print 'Bm:',d1['Bm']
if t in Ttt:
    N = Ttt.index(t)
    print N,d1['Bm'][N]
whoami217
vic57
#6. смотрим не попадается ли это первое число в интервале чисел из колонки Ttt
#7. если попадается, то смотрим в этой строчке,
# какому числу из колонки Bm равно числу N , которое соответствует этому времени.
#? тут я что-то не въехал

колонка t из файла 2.txt:

t

310.212500
314.100000
335.362500
349.637500
352.887500
356.137500
359.387500
362.637500
365.912500
369.137500
372.412500
375.662500
378.937500
382.162500
385.412500
388.662500

первое число в этой колонке 310.212500 нужно его вероятно округлить до десятых 310.2, так как в колонке Ttt не найти точно это число.

колонка Ttt из файла text_1.xls:

Ttt
304.350000
305.000000
305.650000
306.300000
306.950000
307.600000
308.250000
308.900000
309.550000
310.200000
310.850000
311.500000
312.150000
312.800000
313.450000
314.120000

Нужно всю колонку чисел тоже округлить до десятых (я так думаю).
Просматриваем колонку Ttt и встречаем близкое число 310.200000. Далее смотрим колонку Bm этого же файла , где находится колонка t файл 2.txt:

Bm

4
0
2
0
0
0
0
0
0
0
0
0
0
0
0
0

берём именно 4, так как это число на одной строчке с 310.212500. Видим, что Bm = 4, т.е. отличное от нуля. В этом файле 2.txt есть другие колонки X_1, …, X_N и Z_1, …, Z_N, где N в данном случае равно 4. Эти поля X_1, …, X_N и Z_1, …, Z_N с полями №, t, Bm, С и под этими полями строчку, вставляем в новый файл.
как выглядит результат:
№ t Bm X_1 X_2 X_3 X_4 Z_1 Z_2
1 314.112500 4 2.750000 2.750000 2.500000 2.250000 -2100.000000 -19050.000000
Z_3 Z_4 C
13856.250000 9581.250000 125252

Далее из колонки t файла 2.txt после числа 310.212500 берём число 314.100000. И выполняем те же самые операции. Поскольку 314.100000 близкое к 314.120000 из колонки Ttt, то смотрим в колонку Bm. 314.100000 на одной строчке с 0, т.е. Bm = 0, то пропускаем вставку в новый файл. И работаем со строчкой, где Bm = 2. Нужно брать новый файл text_2.xls, которая имеет колонку Ttt:

Ttt
333.400000
334.050000
334.700000
335.350000

И всё по новой делать.
vic57
в какие данные ты берешь из файла text_1.xls ? зачем он вообще нужен?
ты зачем-то проверяешь совпадение 2.txt c text_1.xls, а
все данные забираешь из 2.txt.
ИМХО я бы делал так - если анализируемый файл text_N.xls,
то выходной файл - out_N.xls, а так у тебя логическая дыра получается









whoami217
vic57
какие данные ты берешь из файла text_1.xls ?
беру данные только из колонки Ttt.
зачем-то проверяешь совпадение 2.txt c text_1.xls
потому что сделали на этом акцент, когда давали задание. хотя особо смысла в этом не вижу. плюс беру 2.txt, потому что не все данные нужны из файла 2.txt.

я бы делал так - если анализируемый файл text_N.xls,
то выходной файл - out_N.xls, а так у тебя логическая дыра получается
может действительно сделать так… только вместо text_N.xls нужно взять 2.txt, так как оттуда берутся данные. да и строки с Bm = 0 не берутся в рассмотрение.

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