beginner89
Март 12, 2012 13:48:52
Здравствуйте!
Очень нужна помощь в следующей задаче:
необходимо производить поиск соответсвующего параметра по столбцу (data) в имеющемся xls файле.
Далее если параметр соответсвует то добавлять его в новый xls файл.
Проблема №1 заключается в том что когда при повторном запуске программы, при изменении величины параметра поиска в сущ.файле,
данные в созданный файл добавляются, но стираются данные помещенные туда с предыдущих запусков(при поиске других значений параметра).
№2 если в исходном файле несколько соответствуюющих параметров, то так как организован список, данные в созданный файл выводятся в одну строку, а не в несколько.
Это и понятно, так как организован список. Но каким образом можно этого избежать и корректно сохранять данный в созданные файл?и в тоже время дополнять созданный файл новыми данными.
Вот код который пока удалось сделать:
from xlrd import open_workbook
import xlrd
import xlwt
book = xlwt.Workbook()
rb = open_workbook('C:\qwe.xls')
sheet = rb.sheet_by_index(0)
data = 10 #значение по которому будем искать
L=
for ii in range(sheet.nrows):
value = sheet.cell_value(ii, 0)
if value == data:
for i in range(sheet.ncols):
L.append(sheet.cell_value(ii,i))
sheet = book.add_sheet('sheetname')
ii=0
i=0
for item in L:
sheet.write(ii, i, item)
i=i+1
sheet.portrait = False
book.save('C:\EX\q9.xls')
pyuser
Март 13, 2012 01:38:12
Поскольку попыток форматирования данных у Вас не наблюдается, то просто копируете данные.
Ваш код при этом изменится незначительно, как-то так, например:
import os
import xlrd3, xlwt3
def find_rows(infile, find_data):
"""
Ищет строки с соответствующим значением в столбце поиска
Возвращает найденные строки
"""
ws = xlrd3.open_workbook(infile).sheet_by_index(0)
column = ws.col_values(0, end_rowx=ws.nrows)
# возвращаем строки, соответствующие условию
for j in (i for i, _ in enumerate(column) if _ == find_data):
yield ws.row_values(j, end_colx=ws.nrows)
def write_xls(outfile, rows):
"""
Пишет в выходной файл переданные данные,
сохраняя результаты предидущей работы
"""
wb = xlwt3.Workbook()
ws = wb.add_sheet("sheetname")
def _copy():
"""
Копирует существующий файл без форматирования
Возвращает число скопированных строк
"""
nrows = 0
if os.path.exists(outfile):
rws = xlrd3.open_workbook(outfile).sheet_by_index(0)
nrows = rws.nrows
for i in range(nrows):
for j, v in enumerate(rws.row_values(i, end_colx=rws.ncols)):
ws.write(i, j, v)
return nrows
row_x = _copy()
for row in rows:
for i, v in enumerate(row):
ws.write(row_x, i, v)
row_x += 1
wb.save(outfile)
if "__main__" == __name__:
write_xls("out.xls", find_rows("in.xls", 10))
beginner89
Март 15, 2012 17:59:21
pyuser Огромное спасибо за помощь! Теперь возникла следующая проблема:
при поиске не значения, а текста в качестве искомого параметра возникает следующая ситуация:
если искомый параметр написан на английском языке в коде, и в искомом файле параметры на английском языке, то поиск проходит нормально и записываются данные как положено в создаваемый файл. (искомый параметр - слово stat);
однако если в коде задать искомый параметр на русском языке, и в искомом файле параметры на русском языке, то поиск проходит, но данные не добавляются в создаваемый файл, видимо существует какоето несоответсвие, и он не видит этих параметров. по зарешению done появляется, значит он считает что выполнил код. (искомый параметр слово - стат ). для искомого параметра были заданы атрибуты чтобы он не обращал внимание на регистр.—-(for j in (i for i, _ in enumerate(column) if _.strip().lower() == find_data)—-
if “__main__” == __name__:
write_xls(“C:\EX\out.xls”, find_rows(“C:\EX\init.xls”, ‘Стат’))
print ‘done’
pyuser
Март 16, 2012 08:56:38
if _.strip().lower() =='Стат'
Понимаете, о чем я?
beginner89
Март 17, 2012 08:52:48
Если я Вас правильно понял, то заменить find_data в цикле на искомый параметр ‘Стат’. При этом результаты остаются прежними.он не находит. Возможно я Вас не правильно понял.
а существуют ли атрибуты для сортировки полученных данных, скажем по значениям одного из столбцов?
pyuser
Март 17, 2012 11:59:13
beginner89
Возможно я Вас не правильно понял
Неправильно :(. Я просто показал, что происходит. Вы используете функцию lower, а find_data у Вас начинается с большой буквы.
beginner89
а существуют ли атрибуты для сортировки полученных данных
Честно говоря не понял о чем речь. Чем функция sorted не устраивает?