【问题标题】:Sort csv columns?对csv列进行排序?
【发布时间】:2014-10-19 18:26:17
【问题描述】:

我有一个 CSV 文件,如下所示:

Timestamp;A;O;P;M;
22:05;5;7;2;1
22:10;2;3,4;7
22:15;7;4;3;2

使用 python 脚本,我想订购标题(时间戳除外。它必须是第一列)。我的意思是:

Timestamp;A;M;O;P;
22:05;5;1;7;2
22:10;2;7;3;4
22:15;7;2;4;3

我该怎么做?我没有任何代码,因为我不知道该怎么做。

【问题讨论】:

  • 为什么有些数据用逗号分隔,有些用分号?
  • 所以你只是想重写文件?

标签: python sorting python-2.7 csv


【解决方案1】:

你可以用 NumPy 做到这一点!

import numpy as np

a = np.loadtxt('a.txt', dtype=str, delimiter=';')
s = a[0].argsort() # produces the indexes which would sort the header
s = np.append(0, s[s!=0]) # put 0 at the front again, that's Timestamp
final = a[:,s]
np.savetxt('final.txt', final, fmt='%s', delimiter=';')

【讨论】:

  • 对 numpy 的 +1 不错,尽管我认为在这种情况下它有点矫枉过正。
  • 文件 "C:\Users\ButoeruG\Desktop\xelena\prova\sort.py",第 7 行,在 a = np.loadtxt('finale.txt', dtype=str , delimiter=';') File "C:\Python27\lib\site-packages\numpy\lib\npyio.py", line 856, in loadtxt X = np.array(X, dtype) ValueError: cannot set an array带有序列的元素。这是什么意思?
  • 我认为这是因为您的标题行有一个尾随分隔符。尝试删除它。
  • 什么意思?一个额外的 ';'最后?
  • 是的,你应该在每一行有相同数量的;,但第一行多了一个。
【解决方案2】:

你的意思是这样的?

import csv

with open('old.csv', 'r') as i, open('new.csv', 'w') as o:
   reader = csv.reader(i, delimiter=';')
   writer = csv.writer(o, delimiter=';')
   for row in reader:
      writer.writerow([row[0], row[1], row[4], row[2], row[3]])

【讨论】:

  • 这实际上并没有“排序”任何东西,它只是硬编码移动列。如果这就是 OP 的全部需求,那么使用 awk 或其他东西可能会更快/更容易。无论如何,简单、惯用的 Python 总是好的。 :)
【解决方案3】:

您好,这篇文章可能对您有所帮助。检查此链接。 sort csv by column

https://stackoverflow.com/questions/2100353/sort-csv-by-column

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 2019-08-23
    • 1970-01-01
    • 2015-12-24
    • 2014-07-06
    • 2021-09-04
    • 2016-03-16
    • 2023-03-18
    相关资源
    最近更新 更多