<p>只需按最后一列排序:</p>
<pre><code> sorted(f,key=lambda x: int(x.split(",")[-1]))
</code></pre>
<p>您可以使用对分查找新数据的放置位置,以便在对数据排序一次后保持数据的有序性:</p>
<pre><code>from bisect import bisect
import csv
with open("foo.txt") as f:
r = list(csv.reader(f))
keys = [int(row[-1]) for row in r]
new = ["foo","bar","12","3"]
ind = bisect(keys, int(new[-1]))
r.insert(ind,new)
print(r)
</code></pre>
<p>输出:</p>
<pre><code>[['Kris', 'Rice', '17', '1'], ['Olly', 'Fallows', '17', '2'], ['foo', 'bar', '12', '3'], ['Olivia', 'Bird', '17', '4'], ['Louis', 'Martin', '18', '5']]
</code></pre>
<p>一种更简单的方法是检查第一行是否具有更高的id,如果没有更高的id,只需附加到末尾:</p>
<pre><code>import csv
with open("foo.txt") as f:
r = list(csv.reader(f))
new = ["foo","bar","12","3"]
key = int(new[-1])
ind = None
for i, row in enumerate(r):
if int(row[-1]) >= key:
ind = i
break
r.insert(ind, new) if ind is not None else r.append(new)
print(r)
</code></pre>
<p>输出:</p>
<pre><code> [['Kris', 'Rice', '17', '1'], ['Olly', 'Fallows', '17', '2'], ['foo', 'bar', '12', '3'], ['Olivia', 'Bird', '17', '4'], ['Louis', 'Martin', '18', '5']
</code></pre>
<p>为了在添加新值时始终保持文件的有序性,我们只需写入临时文件,将行写入正确的位置,然后用更新的文件替换原始文件:</p>
<pre><code>import csv
from tempfile import NamedTemporaryFile
from shutil import move
with open("foo.csv") as f, NamedTemporaryFile(dir=".", delete=False) as temp:
r = csv.reader(f)
wr = csv.writer(temp)
new = ["foo", "bar", "12", "3"]
key, ind = int(new[-1]), None
for i, row in enumerate(r):
if int(row[-1]) >= key:
wr.writerow(new)
wr.writerow(row)
wr.writerows(r)
break
wr.writerow(row)
else:
wr.writerow(new)
move(temp.name, "foo.csv")
</code></pre>
<p>你知道吗foo.csv文件之后,数据将按顺序排列:</p>
<pre><code>Kris,Rice,17,1
Olly,Fallows,17,2
foo,bar,12,3
Olivia,Bird,17,4
Louis,Martin,18,5
</code></pre>