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

0 投票
4 回答
670 浏览
提问于 2025-04-18 16:12

我有一个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

试试这个

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

然后把它写入另一个文件,或者按你想要的方式使用它。

1

@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<10)。也就是说,当你按字符串排序时,排序是逐个字符进行的,这样就会导致 A10 在 A2 前面。这就是为什么你需要 字母数字排序算法 以及它在 Python中的实现。所以,当你在排序中实现字母数字键选项后,排序将会按照人类的预期进行。这样,你得到的结果就不会像这样(看起来根本不算排序):

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

撰写回答