Форум сайта python.su
По заголовку понятно, что я новичок в Pythone. Пытаюсь расширять свои знания в этой области. Почитала литературу, теперь надо практиковаться. Решила составить себе задачу, так как интересно научиться работать с данными в формате csv.
Так вот: допустим, у меня есть два файла с данными формата csv. В одном файле - данные, которые могут изменятся (назову его, Таble1.csv). Во втором - значения постоянные (Таble2.csv). В Таble1.csv находится несколько колонок, к примеру, мне нужны данные из третьей колонки. И надо провести сравнения с Таble2.csv, и отыскать значения элемента. К примеру, дан какой-нибудь буквенный код в третий колонке Таble1.csv: ABCD, а в Таble2.csv есть только числовые значения, так сказать матрица :
5 7 9 10 - “C”
11 8 10 0 - “ A”
3 78 6 1 - “D”
15 4 0 8 - “B”
Я знаю, что первая строка принадлежит значению С; 2-ая - А; 3-ья - D; 4 соответственно -В. И мне надо найти сумму значений каждого элемента данного кода, которые берется из столбца Таble1.csv. А данные, полученные в результате вычисления, записываются в другой файл Output.csv - хоть это как сделать я знаю :)
Результат ожидаю такой, для кода АВСD = 11+4+9+1 = 25.
Так у меня сразу же несколько вопросов и просьб:
1) посоветуйте, пожалуйста, господа - питомеры, какие в данном случае операторы лучше всего применить, с чего вообще начать?
2) может Таble2.csv целесообразней прописать как вложенную в коде, а не читать из файла?
3) как мне прописать в коде, чтобы данные считывались именно с 3-го столбца Таble1.csv?
P.S.: я не прошу мне писать код, я хочу сама до него додуматься, но с Вашими подсказками. Вроде и понимаю, что ничего сложного нет, но пока что ничего не получается.
Офлайн
# Записываем образец в файл.
open('file.csv','w').write('5 7 9 10\n11 8 10 0\n 3 78 6 1\n15 4 0 8')
# Читаем образец из файла.
data = dict(zip('CADB', [sum([float(y) for y in x.split()]) for x in open('file.csv')]))
print data
-> {'A': 29.0, 'B': 27.0, 'C': 31.0, 'D': 88.0}
# Чтение строк из файла:
for row in open('MyFile.csv', 'r'):
row # Операции над строкой.
# Разделение строки:
row.split() # По пробелу.
row.split(' ') # Или так.
row.split(',') # По запятой.
Отредактировано (Март 25, 2010 17:35:24)
Офлайн
import csv
Olyaleo, пока не начнете показывать свой код - мало что можно посоветовать.
Офлайн
Вопрос по теме. Исходный файл <1, 2, 3> (без ковычек конечно). Результат работы csv - . У меня огромное количество данных.
В итоге ручное чтение и преобразование в int даёт большую скорость чем работа с csv.
f1 = """
import csv
f = open('1.dat')
csvr = csv.reader(f, skipinitialspace = True)
data = []
for arr in csvr:
data.append(list(map(int, arr)))
"""
f2 = """
f = open('1.dat')
data = []
for string in f.readlines():
data.append(list(map(int, string.rstrip().split(','))))
"""
import timeit
print(timeit.Timer(f1).timeit(10))
print(timeit.Timer(f2).timeit(10))
Офлайн
Если у вас только цифры, зато много - наверное, нужен numpy.
Для чтения - http://www.scipy.org/Numpy_Example_List#loadtxt http://www.scipy.org/Numpy_Example_List#fromfile
Под поворотом массива имели в виду транспонирование? Тогда http://www.scipy.org/Numpy_Example_List#transpose
Отредактировано (Март 26, 2010 13:49:48)
Офлайн
Уважаемый, Андрей, дело в том, что я хотела, чтобы Вы мне посоветовали алгоритм решения этой задачи.
Я начала писать, как я представляю этот алгоритм. Честно, говоря одни тупика, и что я в не верном направлении.
import csv
import math
#Делаю вложенную матрицу
mat = [ [5,11,3,15],
[7,8,78,4],
[9,10,6,0],
[10,0,1,8] ]
#Далее каждому столбцу присвоила имя
for row in mat:
с=row[0: 1]
a=row[1: 2]
d=row[2: 3]
b=row[3: 4]
# Читаю данные с таблицы Input.csv
reader = csv.reader(open('Input.csv', 'rU'), dialect='excel')
#присваиваю имя каждой букве кода 2 столбца
for s in reader:
j1=s[1][0]
j2=s[1][1]
j3=s[1][2]
j4=s[1][3]
Офлайн
В первый раз вы объясняли понятнее.
Попробуйте повторить :)
OlyaleoВ данном участке кода вы берёте из списка mat по одному подсписку.for row in mat:
с=row[0: 1]
a=row[1: 2]
d=row[2: 3]
b=row[3: 4]
Офлайн
GriffonХуже того - csv-модуль не поддерживает расширений CSV используемых многими программами. Ни секций, ни комментариев, ни заголовков.
В итоге ручное чтение и преобразование в int даёт большую скорость чем работа с csv.
Офлайн
knkd, да Вы правы, что-то я накрутила с мыслями. Начну с начала. У меня есть два файла формата Excel (Input и Таbl). В файле Input (во 2-ом столбце ) находятся коды (abcd, acdb, bcda, cabd и т.п. комбинации), а в файле Table находится таблица чисел, которая постоянная:
5, 11, 3, 15
7, 8, 78, 4
9, 10, 6, 0
10, 0, 1, 8
Я знаю, что 1-ому столбцу принадлежат значения буквы “c”, 2-ому-“a”, 3-ему - “d” и 4-ому - “b”. Поэтому я решила сделать эту таблицу в виде вложенной матрицы.
Что я хочу: чтобы программа из Input считывала код, находила значения каждой буквы и их с суммировала. Нахождение своего числа происходит следующим образом:
берется первая буква кода, проверяется по строке вложенной матрицы, где буквы совпали то значение и записывается, например,
первая буква кода - a, ищем по первой строке 5, 11, 3, 15, где у нас будет выполнятся условие a=a, это цифра 11. Так как 2-ой столбец это у нас значения буквы “а” +
вторая буква - b, ищем по второй строке 7, 8, 78, 4, где выполняется условие b=b, это цифра 4. Так как 4-ый столбец это у нас значения буквы “b” +
третья буква - c, ищем по третьей строке 9, 10, 6, 0, где выполняется условие c=c, это цифра 9. Так как 1-ый столбец это у нас значения буквы “c” +
четвертая буква - d, ищем по четвертой строке 10, 0, 1, 8, где выполняется условие d=d, это цифра 1. Так как 3-ий столбец это у нас значения буквы “d”
В результате получаем следующее, для кода abcd = 11+4+9+1=25
к примеру для кода cdaa = 5+78+10+0=93
Вот поэтому я подумала, что надо брать срезы, чтобы проверить условие.
Офлайн
col = "abcd"
row = "bcda"
arr = [[1, 2, 3, 4], [ 5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
sum = 0
for i, char in enumerate(col):
sum += arr[row.index[char]][i]
print sum
Отредактировано (Март 28, 2010 20:31:58)
Офлайн