Python dict
s KHÔNG duy trì thứ tự trước 3.6.
Tuy nhiên, trường hợp của csv.DictReader
mà bạn đang sử dụng (sau khi bạn đã đọc những dòng đầu tiên -!) không có một danh sách .fieldnames
của chuỗi, mà LÀ theo thứ tự.
Vì vậy,
for rowdict in myReader:
print ['%s:%s' % (f, rowdict[f]) for f in myReader.fieldnames]
sẽ cho bạn thấy rằng trật tự thực sự là duy trì (trong .fieldnames
tất nhiên, KHÔNG BAO GIỜ trong dict
- đó là bản chất không thể bằng Python -!).
Vì vậy, giả sử bạn muốn đọc a.csv
và viết b.csv
với cùng thứ tự cột. Sử dụng trình đọc và ghi đơn giản là quá dễ dàng, vì vậy bạn muốn sử dụng các giống Dict thay thế ;-). Vâng, một cách là ...:
import csv
a = open('a.csv', 'r')
b = open('b.csv', 'w')
ra = csv.DictReader(a)
wb = csv.DictWriter(b, None)
for d in ra:
if wb.fieldnames is None:
# initialize and write b's headers
dh = dict((h, h) for h in ra.fieldnames)
wb.fieldnames = ra.fieldnames
wb.writerow(dh)
wb.writerow(d)
b.close()
a.close()
giả sử bạn có tiêu đề trong a.csv
(otherewise bạn không thể sử dụng một DictReader vào nó) và muốn chỉ các tiêu đề tương tự trong b.csv
.
Nguồn
2009-12-11 01:50:46
Cảm ơn Alex Martelli! Bạn đã đi qua và trên các cuộc gọi của nhiệm vụ ở đây :) và ... nó được đánh giá cao! Tôi đã không nhận ra có tên trường, nhưng đọc lại tài liệu API tôi có thể thấy ngay bây giờ. Cảm ơn bạn đã thay thế, nhưng kể từ khi DictReader của tôi hoạt động tốt, tôi sẽ gắn bó với nó. – Alex
@RaffiKhatchadourian a là a.csv, b là b.csv có lẽ là viết tắt để đọc từ tập tin a, wb có lẽ để ghi vào tập tin b, d cho từ điển, dh cho tiêu đề từ điển .... Alex Cảm ơn lời giải thích tuyệt vời ! – Deep
bất kỳ lý do nào tại sao bạn đi qua toàn bộ 'dh = dict (...' '... wb.writerow (dh)' khi bạn có thể thực hiện 'wb.fieldnames = ra.fieldnames; wb.writeheader()'? – Baldrickk