Найти - Пользователи
Полная версия: с чего начать? хочу написать код
Начало » Python для новичков » с чего начать? хочу написать код
1 2 3
knkd
Скушно.
Начал было писать комментарии, но стало лениво. Так что дальше сами.

Файл ‘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)
Файл ‘input.csv’:
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
Файл ‘table.csv’:
 5; 11;  3; 15
7; 8; 78; 4
9; 10; 6; 0
10; 0; 1; 8
Griffon
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
Olyaleo
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'
Как исправить ошибку, подскажите, пожалуйста
pyuser
Olyaleo
Как исправить ошибку, подскажите, пожалуйста
у Вас разделитель “,” вместо “;”, это первое, а второе - какие-то странные у Вас символы конца строки. никогда с *nix не сталкивался, но думаю что вместо символа “\r” должен быть “\n”, функция readlines() не понимает что у Вас не одна строка :(
Griffon
Да. Принимают за конец строки либо “\n”, либо “\r\n”, но никак не “\r”.
Если нормально сохранять файл нет возможности, то можно использовать:
for string in table.readline().split('\r'):
knkd
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
Griffon
Ну мы ведь о читабельности говорим. :)
Просто у тебя там накручено как-то, потому и предложил свой вариант.
А закрыть сам закроет. Чё это я за него работу лишнюю выполнять буду. Как выгрузится программа так и закроется файл. :)
knkd
Griffon
А закрыть сам закроет. Чё это я за него работу лишнюю выполнять буду. Как выгрузится программа так и закроется файл.
В Линуксе да. В винде это не всегда так.
Если в цикле призойдёт исключение и программа завершится, то с определённой степенью вероятности файл останется заблокированным до перезагрузки.

Вот в этом случае интерпретатор сам обовсём позаботится.
for item in open(filename):
Кстати,я не понял ни как работает твой пример, ни даже как мой :D
Я написал его в приступе временного умопомешательства…
Olyaleo
кодом
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)
Данные таблицы input1.csv
1	dfsaas	cccc	242
2 dfsaas bbbb 242
3 dfsaas aaaa 242
4 dfsaas dddd 242
я пишу на python 2.6.1 в Mac OS X
Griffon
Дело в том что код расчитывался на то что будут уникальные символы для каждого столбца.
Тогда надо: row = “abcd” (надеюсь что для строк буквы всегда разные)
for i, char in enumerate(col):
summa += data[row.index(char)][i]
То есть если “cccc” то это сумма всех элементов в строке “c”. Я так понял.
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