Is it possible to keep the column order using csv.DictReader?

后端 未结 5 858
忘掉有多难
忘掉有多难 2020-11-29 04:45

For example, my csv has columns as below:

ID, ID2, Date, Job No, Code

I need to write the columns

5条回答
  •  余生分开走
    2020-11-29 05:12

    Python's dicts do NOT maintain order prior to 3.6 (but, regardless, in that version the csv.DictReader class was modified to return OrderedDicts).

    However, the instance of csv.DictReader that you're using (after you've read the first row!-) does have a .fieldnames list of strings, which IS in order.

    So,

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

    will show you that the order is indeed maintained (in .fieldnames of course, NEVER in the dict -- that's intrinsically impossible in Python!-).

    So, suppose you want to read a.csv and write b.csv with the same column order. Using plain reader and writer is too easy, so you want to use the Dict varieties instead;-). Well, one way is...:

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

    assuming you have headers in a.csv (otherewise you can't use a DictReader on it) and want just the same headers in b.csv.

提交回复
热议问题