2013-12-10 16 views
10

Điều này cảm thấy giống như một câu hỏi rất cơ bản, nhưng tôi không thể tìm thấy bất kỳ đề cập đến nó ở nơi khác. Tôi là người dùng Python bắt đầu.Python: Làm cách nào để sử dụng DictReader hai lần?

Khi tôi đọc dữ liệu bằng DictReader, sau đó sử dụng từ điển, tôi không thể tham chiếu lại từ điển. Ví dụ: sử dụng mã này:

#!/usr/bin/python 

import csv 
import cgi 
import cgitb 
cgitb.enable() 

print "<head><title>Title</title></head><body>" 

f = open("blurbs.csv","rb") 
blurbs = csv.DictReader(f, delimiter="\t") 
for row in blurbs: 
    print row 
for row in blurbs: 
    print row 

f.close() 
print "</body>" 

Sẽ chỉ in ra nội dung của blurbs.csv một lần. Thứ hai "cho hàng trong blurbs:" không có gì. Có cái gì tôi đang mất tích? Làm thế nào tôi có thể biến từ điển thành một thứ mà tôi có thể tham khảo nhiều lần?

Trả lời

9

Bạn chỉ cần tìm kiếm các tập tin trở lại bắt đầu:

with open("blurbs.csv","rb") as f: 
    blurbs = csv.DictReader(f, delimiter="\t") 
    for row in blurbs: 
     print row 
    f.seek(0) 
    for row in blurbs: 
     print row 

Hoặc bạn có thể quấn thế hệ từ điển vào một danh sách các dicts và hoạt động trên rằng:

with open("blurbs.csv","rb") as f: 
    blurbs = list(csv.DictReader(f, delimiter="\t")) 
for row in blurbs: 
    print row 
for row in blurbs: 
    print row 
+0

Điều này không thực sự "biến từ điển thành thứ tôi có thể tham chiếu nhiều lần" – abarnert

+0

Đã thêm một giải pháp thay thế cho câu hỏi thứ hai đó. – Pyrce

6

Trong Python (và hầu như tất cả các ngôn ngữ máy tính), nếu bạn muốn lưu trữ một cái gì đó, bạn phải làm điều đó một cách rõ ràng. Chỉ cần in nó ra không giữ nó xung quanh bất cứ nơi nào ngoại trừ trên màn hình.

Để sử dụng mỗi từ từ điển nhiều lần, nhưng chỉ một lần một lần, thật dễ dàng; rowđã lưu trữ mỗi từ điển, cùng một lúc:

for row in blurbs: 
    print row 
    print row 
    print row 

Để sử dụng tất cả của từ điển liên tục, bạn cần phải lưu trữ tất cả trong số họ ở đâu đó.

Họ đã có trong blurbs, nhưng blurbsiterator —cái gì đó bạn có thể lặp lại một lần. Một khi bạn hoàn thành nó, không có gì còn lại trong đó. Đó là lý do tại sao vòng lặp thứ hai của bạn không in được gì.

Bạn muốn có một sequence —một cái gì đó bạn có thể lập chỉ mục, tìm kiếm, lặp lại hàng chục lần, vv Loại trình tự rõ ràng để sử dụng, khi không có trường hợp đặc biệt nào phải lo lắng, là danh sách. Vì vậy:

with open("blurbs.csv","rb") as f: 
    blurbs = csv.DictReader(f, delimiter="\t") 
    rows = list(blurbs) 

for row in rows: 
    print row 
print rows[13] 
for row in rows: 
    print row 
print sorted(rows) 

Phần Hướng dẫn về Iterators và các phần sau giải thích một số điều này.

0

Nếu bạn muốn tái sử dụng trình đọc, bạn có thể tìm kiếm các tập tin trở lại 0. Nhưng, nếu dòng đầu tiên int csv là tiêu đề, thì đó sẽ là một phần của kết quả:

>>> f = open('file.csv', 'rbU') 
>>> reader = csv.DictReader(f) 
>>> reader.next() 
{'col1': '6', 'col2': '0.9', 'col3': '8'} 
>>> f.seek(0) 
>>> reader.next() 
{'col1': 'col1', 'col2': 'col2', 'col3': 'col3'} 
>>> f.close() 

DictReader sử dụng hàng đầu tiên làm các phím từ điển (nếu chúng không được cung cấp theo cách khác). Tạo một đối tượng trình đọc mới đơn giản hơn rất nhiều. Bạn cũng có thể sao chép dữ liệu vào một cấu trúc dữ liệu như danh sách và lặp lại điều đó.

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