Действительно ли возможно сохранить порядок столбцов с помощью csv. DictReader?

Я - большой поклонник Автогорячая клавиша . Я определил 'макрос' простого текста вставки, который работает в любом приложении. Это работает, когда я нажимаю Ctrl+Shift+V, и вставляет простую версию того, что находится на буфере обмена. Хорошая вещь об Автогорячей клавише: можно кодировать вещи работать способ, которым Вы хотите, чтобы они работали через все приложения.

^+v::
    ; Convert any copied files, HTML, or other formatted text to plain text
    Clipboard = %Clipboard%

    ; Paste by pressing Ctrl+V
    SendInput, ^v
return

36
задан martineau 15 April 2018 в 16:44
поделиться

1 ответ

Python dict НЕ поддерживает порядок до 3.6 (но, несмотря на это, в этой версии класс csv.DictReader был изменен, чтобы возвращать OrderedDict ] с).

Однако экземпляр csv.DictReader , который вы используете (после того, как вы прочитали первую строку! -) , имеет .fieldnames ] список строк, который IS по порядку.

Итак,

for rowdict in myReader:
  print ['%s:%s' % (f, rowdict[f]) for f in myReader.fieldnames]

покажет вам, что порядок действительно поддерживается (конечно, в .fieldnames , НИКОГДА в dict - это невозможно в Python! -).

Итак, предположим, вы хотите прочитать a.csv и написать b.csv с тем же порядком столбцов. Использовать простой читатель и писатель слишком просто, поэтому вы хотите вместо этого использовать разновидности Dict ;-). Ну, один из способов - это ...:

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()

при условии, что у вас есть заголовки в a.csv (иначе вы не можете использовать на нем DictReader) и хотите те же заголовки в b. csv .

56
ответ дан 27 November 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: