如何用Python逐行排序CSV中的字母数字值(a1, a2, a3,...)
我有一个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
,我在这里添加了 A10
和 A2
。现在,如果你按照上面接受的答案来运行,第三行的结果会是:
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