【问题标题】:Python: Sorting a csv by columnPython:按列对 csv 进行排序
【发布时间】:2013-10-02 00:03:04
【问题描述】:

这是我目前所拥有的:

import csv
import operator

with open('Links.csv', 'rb') as input_file, \
open('Link Statements.csv', 'w') as output_file:

reader = csv.reader(input_file, delimiter=',', quoting=csv.QUOTE_NONE)

for row in reader:
    link_name, from_unit, to_unit, rate, type = row
    output_file.write(" %s," % (from_unit))
    output_file.write("Establish %s link %s at %s Kbps to %s.\n" % (type, link_name, rate, to_unit))
    output_file.write(" %s," % (to_unit))
    output_file.write("Terminate %s link %s at %s Kbps from %s.\n" % (type, link_name, rate, from_unit))

data = csv.reader(open('Link Statements.csv'),delimiter=',')
for unit, statement in reader:
print unit
sortedlist = sorted(data, key=operator.itemgetter(0), reverse=True)
sortedlist

我正在创建一个如下所示的 csv:

  RCT-6,Establish LOS UHF MCR link MPP01 at 14336 Kbps to 1/6.
  1/6,Terminate LOS UHF MCR link MPP01 at 14336 Kbps from RCT-6.
  RCT-6,Establish SIPRNET link SIPRPP01 at 8192 Kbps to 1/6.
  1/6,Terminate SIPRNET link SIPRPP01 at 8192 Kbps from RCT-6.
  RCT-6,Establish NIPRNET link NIPRPP02 at 4096 Kbps to 2/6.
  2/6,Terminate NIPRNET link NIPRPP02 at 4096 Kbps from RCT-6.
  RCT-6,Establish BSPE link BSPEPP03 at 472 Kbps to 1/10.
  1/10,Terminate BSPE link BSPEPP03 at 472 Kbps from RCT-6.
  1/10,Establish DPV0 link DPV0PP04 at 472 Kbps to 2/6.
  2/6,Terminate DPV0 link DPV0PP04 at 472 Kbps from 1/10.
  1/6,Establish SIPRNET link SIPRPP04 at 8192 Kbps to 1/3.
  1/3,Terminate SIPRNET link SIPRPP04 at 8192 Kbps from 1/6.
  1/6,Establish NIPRNET link NIPRPP03 at 8192 Kbps to 1/10.
  1/10,Terminate NIPRNET link NIPRPP03 at 8192 Kbps from 1/6.
  3/6,Establish NIPRNET link SIPRPP03 at 4096 Kbps to 1/10.
  1/10,Terminate NIPRNET link SIPRPP03 at 4096 Kbps from 3/6.
  MEB,Establish NIPRNET link NIPRZP01 at 8192 Kbps to RCT-6.
  RCT-6,Terminate NIPRNET link NIPRZP01 at 8192 Kbps from MEB.
  MEB,Establish SIPRNET link SIPRZP01 at 4096 Kbps to RCT-6.
  RCT-6,Terminate SIPRNET link SIPRZP01 at 4096 Kbps from MEB.

我正在尝试按第一列的字母数字对 CSV 进行排序,但我无法让 sortedlist 语句正常工作。

谢谢。

【问题讨论】:

  • 源 csv 是什么样的?请同时修正你的缩进...
  • 当你说“我无法让 sortedlist 语句工作”时,你期望它做什么,它会做什么?

标签: python sorting csv sortedlist


【解决方案1】:

你的第一个问题是:

for unit, statement in reader:
    print unit

reader 是您在此处为Links.csv 文件创建的原始阅读器。我不得不猜测,因为您的问题中没有缩进,但我假设后面的代码在 with 语句之外。如果是这样,您正在尝试遍历一个已经关闭的文件,这将引发一个异常,我认为这就是您所看到的(尽管这只是另一个猜测,因为您还没有告诉我们)。

如果我猜错了,而且这仍然在 with 语句中,那么你有一个不同的问题:Link Statements.csv 还没有关闭,所以它还没有已刷新,因此当您打开它的新句柄时,它可能没有任何内容,或者只有前 7-1/2 行,或其他任何内容。如果是这种情况,只需将此代码从 with 中删除即可。

无论如何,您可能指的是data,而不是reader

--

但如果你修复它,它只会导致一个新问题。 csv.reader 是一个迭代器——你只能迭代它一次。因此,这将打印出每一行,然后sorted 将在您已获取所有内容后对剩余的内容进行排序,这意味着您将获得一个空列表。

如果您确实需要打印出所有值,然后对所有值进行排序,则需要将它们放入一个列表中,如下所示:

data = list(csv.reader(open('Link Statements.csv'),delimiter=','))

虽然我们正在处理它,但值得注意的是您在这里泄露了 Link Statements.csv 文件;最好使用with 语句,就像您在代码前面所做的那样。


最后,除了引用它之外,您不要对末尾的 sortedlist 做任何事情。大概你想print它,用它生成一个新的 CSV 文件,或者做其他事情,而不是什么都不做。


您没有向我们提供源数据,但我可以将您的中间数据复制并粘贴到名为 Link Statements.csv 的内容中,然后运行您的代码的后半部分。如果我这样做,那么运行这个:

data = csv.reader(open('Link Statements.csv'),delimiter=',')
sortedlist = sorted(data, key=operator.itemgetter(0), reverse=True)
for item in sortedlist:
    print item

……我明白了:

['  RCT-6', 'Establish LOS UHF MCR link MPP01 at 14336 Kbps to 1/6.']
['  RCT-6', 'Establish SIPRNET link SIPRPP01 at 8192 Kbps to 1/6.']
['  RCT-6', 'Establish NIPRNET link NIPRPP02 at 4096 Kbps to 2/6.']
['  RCT-6', 'Establish BSPE link BSPEPP03 at 472 Kbps to 1/10.']
['  RCT-6', 'Terminate NIPRNET link NIPRZP01 at 8192 Kbps from MEB.']
['  RCT-6', 'Terminate SIPRNET link SIPRZP01 at 4096 Kbps from MEB.']
['  MEB', 'Establish NIPRNET link NIPRZP01 at 8192 Kbps to RCT-6.']
['  MEB', 'Establish SIPRNET link SIPRZP01 at 4096 Kbps to RCT-6.']
['  3/6', 'Establish NIPRNET link SIPRPP03 at 4096 Kbps to 1/10.']
['  2/6', 'Terminate NIPRNET link NIPRPP02 at 4096 Kbps from RCT-6.']
['  2/6', 'Terminate DPV0 link DPV0PP04 at 472 Kbps from 1/10.']
['  1/6', 'Terminate LOS UHF MCR link MPP01 at 14336 Kbps from RCT-6.']
['  1/6', 'Terminate SIPRNET link SIPRPP01 at 8192 Kbps from RCT-6.']
['  1/6', 'Establish SIPRNET link SIPRPP04 at 8192 Kbps to 1/3.']
['  1/6', 'Establish NIPRNET link NIPRPP03 at 8192 Kbps to 1/10.']
['  1/3', 'Terminate SIPRNET link SIPRPP04 at 8192 Kbps from 1/6.']
['  1/10', 'Terminate BSPE link BSPEPP03 at 472 Kbps from RCT-6.']
['  1/10', 'Establish DPV0 link DPV0PP04 at 472 Kbps to 2/6.']
['  1/10', 'Terminate NIPRNET link NIPRPP03 at 8192 Kbps from 1/6.']
['  1/10', 'Terminate NIPRNET link SIPRPP03 at 4096 Kbps from 3/6.']

所以,您的sorted 行似乎正是您想要的;是你弄错了周围的一切

【讨论】:

  • 谢谢,这一切都说得通,我现在可以按我想要的方式工作了。得知这是我第一次尝试编写任何代码,您可能不会感到惊讶,但我想我已经弄清楚了这个小项目。
  • @nort0:嗯,你自己搞定了所有困难的事情,只是一堆小细节妨碍了你。这是您对刚起步但有潜力的人的期望。
猜你喜欢
  • 2011-01-07
  • 2019-08-23
  • 2021-06-02
  • 2015-12-24
  • 2014-07-06
  • 2015-10-29
  • 1970-01-01
  • 2021-09-04
相关资源
最近更新 更多