【问题标题】:How to sort a file alphabetically by named column, python, csv如何按命名列,python,csv按字母顺序对文件进行排序
【发布时间】:2018-05-05 12:05:12
【问题描述】:

我有三个 csv 文件,每个文件都有三个命名列,“Genus”、“Species”和“Source”。我将文件合并到一个新文档中,现在我需要按字母顺序排列列,首先按属,然后按物种。我想我可以通过首先按字母顺序排列物种,然后是属,然后它们应该按正确的顺序排列,但我无法在网上找到任何解决如何对命名的字符串列进行排序的东西。我尝试了很多不同的排序方式,但要么没有改变任何东西,要么用最后一个字符串替换了第一列中的所有字符串。

这是我合并文件的代码:

import csv, sys

with open('Footit_aphid_list_mod.csv', 'r') as inny:
    reader = csv.DictReader(inny)

    with open('Favret_aphid_list_mod.csv', 'r') as inny:
        reader1 = csv.DictReader(inny)

        with open ('output_al_vonDohlen.csv', 'r') as inny:
            reader2 = csv.DictReader(inny)

            with open('aphid_list_complete.csv', 'w') as outty:
                fieldnames = ['Genus', 'Species', 'Source']
                writer = csv.DictWriter(outty, fieldnames = fieldnames)
                writer.writeheader() 

                for record in reader:
                    writer.writerow(record)
                for record in reader1:
                    writer.writerow(record)
                for record in reader2:
                    writer.writerow(record)

                for record in reader:
                    g = record['Genus']
                    g = sorted(g)
                    writer.writerow(record)

inny.closed
outty.closed

【问题讨论】:

标签: python csv sorting python-2.x


【解决方案1】:

如果您的文件不是特别大,则将所有行读入一个列表,对其进行排序,然后将其写回:

#!python2
import csv

rows = []

with open('Footit_aphid_list_mod.csv','rb') as inny:
    reader = csv.DictReader(inny)
    rows.extend(reader)

with open('Favret_aphid_list_mod.csv','rb') as inny:
    reader = csv.DictReader(inny)
    rows.extend(reader)

with open('output_al_vonDohlen.csv','rb') as inny:
    reader = csv.DictReader(inny)
    rows.extend(reader)

rows.sort(key=lambda d: (d['Genus'],d['Species']))

with open('aphid_list_complete.csv','wb') as outty:
    fieldnames = ['Genus','Species','Source']
    writer = csv.DictWriter(outty,fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(rows)

【讨论】:

  • 这成功了!唯一的问题是,因为我使用的是 2.7,我不得不从 'open' 中删除所有 'newline=' 属性——但没有它们一切都很好。
  • @birdoptera 已更新。请注意每个 csv 文档对 Python 2 使用二进制模式而不是 newline=''
猜你喜欢
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多