2014-05-12 18 views
9

Tôi đang gặp khó khăn khi viết từ điển danh sách vào tệp .csv.Viết từ điển danh sách vào tệp CSV

Đây là cách từ điển của tôi trông giống như:

dict[key1]=[1,2,3] 
dict[key2]=[4,5,6] 
dict[key3]=[7,8,9] 

Tôi muốn các tập tin .csv để trông giống như:

key1 key2 key3 
1  4  7 
2  5  8 
3  6  9 

Lúc đầu, tôi viết tiêu đề:

outputfile = open (file.csv,'wb') 
writefile = csv.writer (outputfile) 
writefile.writerow(dict.keys()) 

Cho đến nay rất tốt ... Tuy nhiên, vấn đề của tôi là tôi không biết làm thế nào tôi có thể gán một danh sách cho cột tương ứng. ví dụ:

for i in range(0,len(dict[key1])): 
    writefile.writerow([dict[key1][i],dict[key2][i],dict[key3][i]) 

sẽ điền ngẫu nhiên các cột. Một vấn đề khác là, tôi phải tự điền vào các phím và không thể sử dụng nó cho một từ điển khác với 4 phím.

+0

Bạn có ý nghĩa gì khi "điền các cột ngẫu nhiên"? –

+2

@RobWatts Tôi nghĩ rằng OP có nghĩa là vì 'dict' s không có thứ tự, hàm 'keys()' sẽ in chúng ra "ngẫu nhiên", ví dụ. Khóa 3, Khóa 1, Khóa 2 – CoryKramer

+0

Nhân tiện, bạn không nên sử dụng 'dict' làm tên biến. –

Trả lời

21

Nếu bạn không quan tâm đến thứ tự của các cột của bạn (từ điển là không có thứ tự), bạn chỉ có thể sử dụng zip():

d = {"key1": [1,2,3], "key2": [4,5,6], "key3": [7,8,9]} 
with open("test.csv", "wb") as outfile: 
    writer = csv.writer(outfile) 
    writer.writerow(d.keys()) 
    writer.writerows(zip(*d.values())) 

Kết quả:

key3 key2 key1 
7  4  1 
8  5  2 
9  6  3 

Nếu bạn quan tâm đến đơn đặt hàng, bạn cần phải sắp xếp các phím:

keys = sorted(d.keys()) 
with open("test.csv", "wb") as outfile: 
    writer = csv.writer(outfile, delimiter = "\t") 
    writer.writerow(keys) 
    writer.writerows(zip(*[d[key] for key in keys])) 

Kết quả:

key1 key2 key3 
1  4  7 
2  5  8 
3  6  9 
+0

làm thế nào chúng ta có thể thay đổi hàng thành cột ở đây key1 \ tab 7 \ tab 4 \ tab 1 –

+1

Nếu bạn nhìn vào câu hỏi, tôi đã sử dụng' zip() 'để chuyển đổi dữ liệu gốc. Nếu bạn thực hiện lại thao tác này, bạn sẽ thay đổi hàng thành cột một lần nữa. Lưu ý rằng 'key1 - 7 - 4 - 1' có lẽ không phải là những gì bạn muốn ... –

+0

Điều này chạy cho tôi và tôi nhận được kết quả mà tôi muốn, nhưng nó vẫn ném một đối số zip" typeError # 1 phải hỗ trợ lặp lại ". Có lý do nào cho việc này không? – jwoe

0
key_list = my_dict.keys()  
limit = len(my_dict[key_list[0]])  

for index in range(limit):  
    writefile.writerow([my_dict[x][index] for x in key_list]) 
1

Với

dict = {} 
dict['key1']=[1,2,3] 
dict['key2']=[4,5,6] 
dict['key3']=[7,8,9] 

Các mã sau đây:

COL_WIDTH = 6 
FMT = "%%-%ds" % COL_WIDTH 

keys = sorted(dict.keys()) 

with open('out.csv', 'w') as csv: 
    # Write keys  
    csv.write(''.join([FMT % k for k in keys]) + '\n') 

    # Assume all values of dict are equal 
    for i in range(len(dict[keys[0]])): 
     csv.write(''.join([FMT % dict[k][i] for k in keys]) + '\n') 

tạo ra một csv trông giống như:

key1 key2 key3 
1  4  7 
2  5  8 
3  6  9 
1

cuộn của riêng bạn mà không csv mô-đun:

d = {'key1' : [1,2,3], 
    'key2' : [4,5,6], 
    'key3' : [7,8,9]} 

column_sequence = sorted(d.keys()) 
width = 6 
fmt = '{{:<{}}}'.format(width) 
fmt = fmt*len(column_sequence) + '\n' 

output_rows = zip(*[d[key] for key in column_sequence]) 

with open('out.txt', 'wb') as f: 
    f.write(fmt.format(*column_sequence)) 
    for row in output_rows: 
     f.write(fmt.format(*row)) 
Các vấn đề liên quan