2014-12-10 20 views
6

Code tôi có cho đến nay là một chức năng cơ bản đọc một tập tin csv và in nội dung của nó:Chuyển đổi nội dung của một tập tin CSV vào một cuốn từ điển

def read(filename): 
    with open(filename, 'r') as csvfile: 
     reader = csv.reader(csvfile, delimiter=',') 
     for row in reader: 
      print(row) 

Nội dung sailor.csv:

name, mean performance , std dev 
Alice, 100, 0, 
Bob, 100, 5, 
Clare, 100, 10, 
Dennis, 90, 0, 
Eva, 90, 5, 

read('sailor.csv') và chạy chức năng

sản lượng hiện tại:

['name', ' mean performance ', ' std dev'] 
['Alice', ' 100', ' 0', ''] 
['Bob', ' 100', ' 5', ''] 
['Clare', ' 100', ' 10', ''] 
['Dennis', ' 90', ' 0', ''] 
['Eva', ' 90', ' 5', ''] 

cần đầu ra:

{'Dennis': (90.0, 0.0), 'Clare':(100.0, 10.0), 
'Eva': (90.0, 5.0), 'Bob': (100.0, 5.0), 'Alice': (100.0, 0.0)} 

bất kỳ ý tưởng làm thế nào tôi có thể đạt được kết quả đó? Sử dụng Python 3.4.2 nếu điều đó giúp, giải thích về câu trả lời của bạn sẽ được đánh giá cao!

Trả lời

2

Tôi nghĩ rằng đây là những gì bạn muốn:

import csv 

def read(filename): 
    out_dict = {} 
    with open(filename, 'r') as csvfile: 
     reader = csv.reader(csvfile, delimiter=',') 
     next(csvfile) # skip the first row 
     for row in reader: 
      out_dict[row[0]] = float(row[1]), float(row[2]) 
      print(row) 

    return out_dict 

print(read('data.csv')) 

Prints:

{'Bob': (' 100', ' 5'), 'Clare': (' 100', ' 10'), 'Alice': (' 100', ' 0'), 'Dennis': (' 90', ' 0'), 'Eva': (' 90', ' 5')} 

Không nhiều để giải thích ở đây. Chỉ cần đặt các giá trị trong từ điển và bỏ qua hàng đầu tiên được thêm vào. Tôi cho rằng tên người là duy nhất.

+0

Đầu ra yêu cầu của ông có số điểm động; hoặc có thể nó chỉ là ".0" được thêm vào. Và không có dấu ngoặc kép nào xung quanh các con số. – Marichyasana

+0

Tôi chỉnh sửa nó một chút, thêm phao trước hàng [1] và hàng [2] cố định các con số .. bây giờ nó hoạt động hoàn hảo! Cảm ơn!- Không cần phải sử dụng in hoặc là tôi sẽ gọi chức năng sau này .. đọc ('sailor.csv') làm việc cho tôi! – Alex

+0

@Alex FYI, nếu bạn đưa ra đề xuất chỉnh sửa, bạn nên cung cấp mô tả chi tiết hơn về * lý do * bạn đã chỉnh sửa (thay vì * những gì * bạn đã chỉnh sửa) ... Bạn không thể xem các nhận xét trong Đánh giá chỉnh sửa được đề xuất; chỉ bài đăng có thay đổi và lý do bạn cung cấp; [xem bài đăng meta này] (http://meta.stackoverflow.com/questions/278894/more-context-in-the-suggested-edits-review) ... Bạn cũng không nên thay đổi câu hỏi của mình để bao gồm các câu hỏi được chấp nhận câu trả lời; bạn bấm vào "chấp nhận" trên một câu hỏi để làm điều đó, điều này giữ cho câu hỏi "sạch" đối với những người trong tương lai với một vấn đề tương tự mà kết thúc ở đây. – Carpetsmoker

8

sử dụng thư viện chuẩn csv và một sự hiểu biết từ điển ...

import csv 
with open('sailor.csv') as csvfile: 
    reader = csv.reader(csvfile) 
    next(reader) 
    d = {r[0] : tuple(r[1:-1]) for r in reader} 

đâu d sẽ là từ điển mà bạn muốn. d[1:-1] cắt mảng từ thứ hai sang phần tử thứ hai thành phần tử cuối cùng.

EDIT: bỏ qua tiêu đề, chuyển đến các bộ

+0

gì về dòng đầu tiên: '[ 'tên', 'có nghĩa là hiệu suất', ' std dev '] '? – Marcin

+0

Điều này là gần, nhưng những con số có nghĩa là để được trong tuples tôi nghĩ? như vậy: 'Eva': (90.0, 5.0) không phải là 'Eva': [90.0, 5.0]. Và 'tên': ['hiệu suất trung bình'] cũng được in – Alex

0

Sử dụng DictReader:

def read(filename): 
    with open(filename, 'r') as csvfile: 
     reader = csv.DictReader(csvfile, delimiter=',') 
     for row in reader: 
      print(row) 
+1

sẽ không mỗi hàng là '{" header1 ": val1," header2 ": val2, ...}' thay vì tuple/danh sách như được hiển thị ở trên? –

+0

bạn là chính xác. tôi đã đọc câu hỏi. cảm ơn! – Andrew

2

Vì vậy ... Tôi biết câu hỏi này đã được trả lời chủ yếu, nhưng tôi nghĩ rằng tôi chỉ muốn ném một lớp lót trong hỗn hợp để thêm vào để rút ngắn câu trả lời:

from csv import reader 
from itertools import islice 

{r[0] : tuple(r[1:-1]) for r in islice(reader(open('sailor.csv')), 1, None)} 

điều duy nhất thực sự cuốn tiểu thuyết được thêm islice bỏ qua dòng tiêu đề sạch.

+0

một điều bạn bỏ lỡ là làm cho các con số nổi, khác hơn là tốt đẹp :) – Alex

0

Đây là giải pháp của tôi nếu tôi có thể:

>>> import pyexcel as pe 
>>> s = pe.load("sailor.csv", name_rows_by_column=0, name_columns_by_row=0) 
>>> s.format(float) 
>>> s 
Sheet Name: csv 
+--------+------------------+---------+---+ 
|  | mean performance | std dev | | 
+========+==================+=========+===+ 
| Alice | 100    | 0  | 0 | 
+--------+------------------+---------+---+ 
| Bob | 100    | 5  | 0 | 
+--------+------------------+---------+---+ 
| Clare | 100    | 10  | 0 | 
+--------+------------------+---------+---+ 
| Dennis | 90    | 0  | 0 | 
+--------+------------------+---------+---+ 
| Eva | 90    | 5  | 0 | 
+--------+------------------+---------+---+ 
>>> del s.column[''] # delete the column which has '' as its name 
>>> s.to_dict(True) # make a dictionary using row names as key 
OrderedDict([('Alice', [100.0, 0.0]), ('Bob', [100.0, 5.0]), 
('Clare', [100.0, 10.0]), ('Dennis', [90.0, 0.0]), ('Eva', [90.0, 5.0])]) 

Dưới đây là tài liệu trên pe.loadto_dict của pyexcel

Các vấn đề liên quan