Форум сайта python.su
Скушно.
Начал было писать комментарии, но стало лениво. Так что дальше сами.
Файл ‘holyava.py’:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def get_table(table):
# Раз колонкам всегда соответствует одна буква,
# то создадим по списку для каждой колонки.
col_a = []
col_b = []
col_c = []
col_d = []
# Пройдёмся циклом по _строкам_ файла 'table.csv'
for row in open(table, 'r'):
# Разделим строки на элементы.
row_list = row.split(';')
# Проигнорируем неправильные или пустые строки.
if len(row_list) >= 4:
# Положим каждое значение в соответствующий список.
col_c.append(float(row_list[0]))
col_a.append(float(row_list[1]))
col_d.append(float(row_list[2]))
col_b.append(float(row_list[3]))
# Объединяем значения колонок, в один кортеж.
# Их тоже, на всякий случай превращаем в кортеж.
data = (tuple(col_a), tuple(col_b), tuple(col_c), tuple(col_d))
return data
def get_input(infile):
data = []
# Пройдёмся циклом по _строкам_ файла 'input.csv'
for row in open(infile, 'r'):
# Разделим строки на элементы.
row_list = row.split(';')
# Кладём в список значение второго элемента строки,
# отрезая переводы строки.
row_list = row_list[1].strip()
data.append(row_list)
# Преобразовуем в кортеж.
data = tuple(data)
return data
def get_input_num(indata):
input_table = 'abcd'
new_data = []
for row in indata:
new_row = []
for item in input_table:
new_item = row.index(item)
new_row.append(new_item)
new_data.append(tuple(new_row))
new_data = tuple(new_data)
return new_data
def get_sum_list(table, input_num):
res_data = []
for pattern in input_num:
sum = 0
for col_num in xrange(len(table)):
row_num = pattern[col_num]
num = table[col_num][row_num]
sum += num
res_data.append(sum)
res_data = tuple(res_data)
return res_data
def main(infile, table):
# Получаем таблицу.
table = get_table(table)
# Получаем содержимое файла 'input.csv'.
indata = get_input(infile)
# Преобразовываем содержимое 'input.csv' в номера строк.
input_num = get_input_num(indata)
sum_list = get_sum_list(table, input_num)
return sum_list
if __name__ == '__main__':
infile = 'input.csv'
table = 'table.csv'
print main(infile, table)
01 ; abcd
02 ; abdc
03 ; acbd
04 ; acdb
05 ; adbc
06 ; adcb
07 ; bacd
08 ; badc
09 ; bcad
10 ; bcda
11 ; bdac
12 ; bdca
13 ; cabd
14 ; cadb
15 ; cbad
16 ; cbda
17 ; cdab
18 ; cdba
19 ; dabc
20 ; dacb
21 ; dbac
22 ; dbca
23 ; dcab
24 ; dcba
5; 11; 3; 15
7; 8; 78; 4
9; 10; 6; 0
10; 0; 1; 8
Офлайн
row = tuple(enumerate("cadb"))
result = []
table = open('table.csv')
data = []
for string in table.readlines():
data.append(map(int, string.rstrip().split(';')))
inputs = open('input.csv')
for string in inputs.readlines():
col = string.split(';')[2].strip()
summa = 0
for i, char in row:
summa += data[i][col.index(char)]
result += [summa]
print(result)
table.csv
5; 11; 3; 15
7; 8; 78; 4
9; 10; 6; 0
10; 0; 1; 8
input.csv
1 ; dfsaas ; cadb ; 242
1 ; dfsaas ; cdab ; 242
1 ; dfsaas ; dbca ; 242
Вывод консоли:
27, 101, 16
Отредактировано (Март 28, 2010 23:19:52)
Офлайн
knkd и Griffon, спасибо Вам за помощь, буду разбираться с кодами.
Я начала с кода, который написал Griffon, но мне не удается запустить скрипт, так как выдается ошибка:
[olga~/python_file]-% python programm_calculate.py
Traceback (most recent call last):
File "programm_calculate.py", line 13, in <module>
data.append(map(int, string.rstrip().split(';')))
ValueError: invalid literal for int() with base 10: '5,11,3,15\r7,8,78,4\r9,10,6,0\r10,0,1,8'
Офлайн
Olyaleoу Вас разделитель “,” вместо “;”, это первое, а второе - какие-то странные у Вас символы конца строки. никогда с *nix не сталкивался, но думаю что вместо символа “\r” должен быть “\n”, функция readlines() не понимает что у Вас не одна строка :(
Как исправить ошибку, подскажите, пожалуйста
Офлайн
Да. Принимают за конец строки либо “\n”, либо “\r\n”, но никак не “\r”.
Если нормально сохранять файл нет возможности, то можно использовать:
for string in table.readline().split('\r'):
Офлайн
GriffonА закрыть? :)
table = open('table.csv')
GriffonМожно заменить вот этим:table = open('table.csv')
data = []
for string in table.readlines():
data.append(map(int, string.rstrip().split(';')))
data = [[int(item) for item in row.strip().split(';')] for row in open('table.csv')]
result = [sum([data[i][string.split(';')[1].strip().index(char)] for (i,char) in row]) for string in open('input.csv')]
row = tuple(enumerate("cadb"))
data = [[int(item) for item in row.strip().split(';')] for row in open('table.csv')]
result = [sum([data[i][string.split(';')[1].strip().index(char)] for (i,char) in row]) for string in open('input.csv')]
print result
Отредактировано (Март 29, 2010 18:11:59)
Офлайн
Ну мы ведь о читабельности говорим. :)
Просто у тебя там накручено как-то, потому и предложил свой вариант.
А закрыть сам закроет. Чё это я за него работу лишнюю выполнять буду. Как выгрузится программа так и закроется файл. :)
Отредактировано (Март 29, 2010 19:43:50)
Офлайн
GriffonВ Линуксе да. В винде это не всегда так.
А закрыть сам закроет. Чё это я за него работу лишнюю выполнять буду. Как выгрузится программа так и закроется файл.
for item in open(filename):
Офлайн
кодом
Griffonошибку не удалось исправить.
Код:
for string in table.readline().split('\r'):
GriffonОказалось, что у меня действительно файлы были сохранены для разных OS, после пересохранения ошибка ликвидировалась, зато вместо неё теперь появилась новая:
Если нормально сохранять файл нет возможности…
[olga ~/python_file]-% python programm_calculate.py
Traceback (most recent call last):
File "programm_calculate.py", line 20, in <module>
summa += data[i][col.index(char)]
ValueError: substring not found
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import csv
import math
row = tuple(enumerate("abcd"))
result = []
table = open('table.csv')
data = []
for string in table.readlines():
data.append(map(int, string.rstrip().split(',')))
inputs = open('input1.csv')
for string in inputs.readlines():
col = string.split(',')[2].strip()
summa = 0
for i, char in row:
summa += data[i][col.index(char)]
result += [summa]
print(result)
1 dfsaas cccc 242
2 dfsaas bbbb 242
3 dfsaas aaaa 242
4 dfsaas dddd 242
Офлайн
Дело в том что код расчитывался на то что будут уникальные символы для каждого столбца.
Тогда надо: row = “abcd” (надеюсь что для строк буквы всегда разные)
for i, char in enumerate(col):
summa += data[row.index(char)][i]
Офлайн