如何使用Python排序后的CSV行中的字母数字值(a1,a2,a3,...)

时间:2014-08-06 09:12:15

标签: python sorting csv

我有一个完整的CSV文件包含这样的内容:

L4,B4
B3,C3,B2
B2,A1,C9,F3
F1,E1
F3,E4,I9,A2,F1
K4

我想得到的是:

B4,L4
B2,B3,C3
A1,B2,C9,F3
E1,F1
A2,E4,F1,F3,I9
K4

因此,目标是以一种以数字方式对其进行排序 - 对于一行中的所有元素。每行的条目数一致!

我已经尝试使用libreoffice进行排序(使用从左到右的排序),但我无法使其工作。还看了python来完成这项工作,但没有成功。

任何想法如何将这些东西排序 - 最好是使用Python?

感谢您的帮助! 谢谢!

4 个答案:

答案 0 :(得分:1)

for line in file.read().split('\n'):
    l = line.split(',')
    l.sort()

然后将其写入另一个文件,或者无论如何都要使用它。

答案 1 :(得分:1)

with open('file.txt') as f:                        
    for line in f:                                 
        print ",".join(sorted(line.rstrip().split(',')))

<强>输出

B4,L4
B2,B3,C3
A1,B2,C9,F3
E1,F1
A2,E4,F1,F3,I9
K4

答案 2 :(得分:0)

试试这个

file_name = open('i_c.csv','rb')
for line in file_name:
    if line != '\n':
        print ",".join(sorted(line.strip().split(',')))

答案 3 :(得分:0)

@Ashoka Lella提供的答案很好,但还不完整。

假设我们提供了相同的文件样本,但稍有改动:

L4,B4
B3,C3,B2
B2,A1,C9,F3,A10,A2
F1,E1
F3,E4,I9,A2,F1
K4

为了清楚起见:文件是相同的,除了第三行B2,A1,C9,F3,A10,A2,我添加了A10A2。现在,如果按照上面接受的答案运行它,第三行的结果将是:

A1,A10,A2,B2,C9,F3

这不是人类如何对列表进行排序(A2应该在A10之前,因为2&lt; 10)。也就是说,当你按字符串排序时 - 这就是它的完成方式:一次排序每个下一个字符,这将导致A10在A2之前。这就是您需要alphanum sorting algorithm及其implementation in Python的原因。因此,在排序中实现alphanum键选项后,排序将以人类期望的方式执行。有了这个,而不是像这样的结果(当你看它时,它不是真正的排序):

A1,A10,A2,B2,C9,F3

你会得到一个更好的答案:

A1,A2,A10,B2,C9,F3

这是Ashoka代码的增强版:

import re

convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]

with open('file.txt') as f:
    for line in f:
        print ",".join(sorted(line.rstrip().split(','), key = alphanum_key))