在Python中对CSV进行排序

Pra*_*nab 6 python csv sorting

我假设使用Python在多个文本/数字字段上排序CSV文件将是一个已经解决的问题.但我无法在任何地方找到任何示例代码,除了专注于排序日期字段的特定代码.

如何按顺序对多个字段中的相对较大的CSV文件(数万行)进行排序?

Python代码示例将不胜感激.

Ale*_*lli 10

Python的排序仅在内存中工作; 但是,在现代机器上,成千上万的线条应该很容易记忆.所以:

import csv

def sortcsvbymanyfields(csvfilename, themanyfieldscolumnnumbers):
  with open(csvfilename, 'rb') as f:
    readit = csv.reader(f)
    thedata = list(readit)
  thedata.sort(key=operator.itemgetter(*themanyfieldscolumnnumbers))
  with open(csvfilename, 'wb') as f:
    writeit = csv.writer(f)
    writeit.writerows(thedata)
Run Code Online (Sandbox Code Playgroud)


Rob*_*ney 4

这是亚历克斯的答案,经过修改以支持列数据类型:

import csv
import operator

def sort_csv(csv_filename, types, sort_key_columns):
    """sort (and rewrite) a csv file.
    types:  data types (conversion functions) for each column in the file
    sort_key_columns: column numbers of columns to sort by"""
    data = []
    with open(csv_filename, 'rb') as f:
        for row in csv.reader(f):
            data.append(convert(types, row))
    data.sort(key=operator.itemgetter(*sort_key_columns))
    with open(csv_filename, 'wb') as f:
        csv.writer(f).writerows(data)
Run Code Online (Sandbox Code Playgroud)

编辑:

我做了一件蠢事。convert几天前,我在 IDLE 中玩了各种东西并编写了一个函数。我忘了我写过它,而且我已经很长一段时间没有关闭 IDLE - 所以当我写上面的内容时,我认为这convert是一个内置函数。可悲的是没有。

这是我的实现,尽管 John Machin 的更好:

def convert(types, values):
    return [t(v) for t, v in zip(types, values)]
Run Code Online (Sandbox Code Playgroud)

用法:

import datetime
def date(s):
    return datetime.strptime(s, '%m/%d/%y')

>>> convert((int, date, str), ('1', '2/15/09', 'z'))
[1, datetime.datetime(2009, 2, 15, 0, 0), 'z']
Run Code Online (Sandbox Code Playgroud)