Преобразование csv файла в список кортежей с помощью python
Я возьму csv с 4 столбцами: бренд, цена, вес и тип.
Типы: апельсин, яблоко, груша, слива.
Параметры: мне нужно выбрать наиболее возможный вес, но выбрав 1 оранжевый, 2 груши, 3 яблок и 1 сливу, не превышающую бюджет в 20 долларов. Я не могу повторять марки одних и тех же фруктов (например, выбирать одну и ту же марку яблока 3 раза и т.д.).
Я могу открыть и прочитать файл csv через Python, но я не уверен, как создать словарь или список кортежей из файла csv?
Для большей ясности здесь представлена идея данных.
Brand, Price, Weight, Type
brand1, 6.05, 3.2, orange
brand2, 8.05, 5.2, orange
brand3, 6.54, 4.2, orange
brand1, 6.05, 3.2, pear
brand2, 7.05, 3.6, pear
brand3, 7.45, 3.9, pear
brand1, 5.45, 2.7, apple
brand2, 6.05, 3.2, apple
brand3, 6.43, 3.5, apple
brand4, 7.05, 3.9, apple
brand1, 8.05, 4.2, plum
brand2, 3.05, 2.2, plum
Здесь все, что у меня есть прямо сейчас:
import csv
test_file = 'testallpos.csv'
csv_file = csv.DictReader(open(test_file, 'rb'), ["brand"], ["price"], ["weight"], ["type"])
Ответы
Ответ 1
Вы можете подумать над этим:
import csv
def fitem(item):
item=item.strip()
try:
item=float(item)
except ValueError:
pass
return item
with open('/tmp/test.csv', 'r') as csvin:
reader=csv.DictReader(csvin)
data={k.strip():[fitem(v)] for k,v in reader.next().items()}
for line in reader:
for k,v in line.items():
k=k.strip()
data[k].append(fitem(v))
print data
Печать
{'Price': [6.05, 8.05, 6.54, 6.05, 7.05, 7.45, 5.45, 6.05, 6.43, 7.05, 8.05, 3.05],
'Type': ['orange', 'orange', 'orange', 'pear', 'pear', 'pear', 'apple', 'apple', 'apple', 'apple', 'plum', 'plum'],
'Brand': ['brand1', 'brand2', 'brand3', 'brand1', 'brand2', 'brand3', 'brand1', 'brand2', 'brand3', 'brand4', 'brand1', 'brand2'],
'Weight': [3.2, 5.2, 4.2, 3.2, 3.6, 3.9, 2.7, 3.2, 3.5, 3.9, 4.2, 2.2]}
Если вы хотите, чтобы CSV файл был буквально в виде кортежей по строкам:
import csv
with open('/tmp/test.csv') as f:
data=[tuple(line) for line in csv.reader(f)]
print data
# [('Brand', ' Price', ' Weight', ' Type'), ('brand1', ' 6.05', ' 3.2', ' orange'), ('brand2', ' 8.05', ' 5.2', ' orange'), ('brand3', ' 6.54', ' 4.2', ' orange'), ('brand1', ' 6.05', ' 3.2', ' pear'), ('brand2', ' 7.05', ' 3.6', ' pear'), ('brand3', ' 7.45', ' 3.9', ' pear'), ('brand1', ' 5.45', ' 2.7', ' apple'), ('brand2', ' 6.05', ' 3.2', ' apple'), ('brand3', ' 6.43', ' 3.5', ' apple'), ('brand4', ' 7.05', ' 3.9', ' apple'), ('brand1', ' 8.05', ' 4.2', ' plum'), ('brand2', ' 3.05', ' 2.2', ' plum')]
Ответ 2
import csv
with open("some.csv") as f:
r = csv.reader(f)
print filter(None,r)
или с пониманием списка
import csv
with open("some.csv") as f:
r = csv.reader(f)
print [row for row in r if row]
для сравнения
In [3]: N = 100000
In [4]: the_list = [randint(0,3) for _ in range(N)]
In [5]: %timeit filter(None,the_list)
1000 loops, best of 3: 1.91 ms per loop
In [6]: %timeit [i for i in the_list if i]
100 loops, best of 3: 4.01 ms per loop
[edit], так как ваш фактический вывод не имеет пробелов, которые вам не нужны для понимания списка или фильтра, вы можете просто сказать list(r)
Окончательный ответ без пустых строк
import csv
with open("some.csv") as f:
print list(csv.reader(f))
если вы хотите, чтобы dicts вы могли делать
import csv
with open("some.csv") as f:
reader = list(csv.reader(f))
print [dict(zip(reader[0],x)) for x in reader]
#or
print map(lambda x:dict(zip(reader[0],x)), reader)