拆分&编辑CSV列&按字母顺序排列

时间:2016-05-10 04:35:10

标签: python mysql sorting csv dictionary

我为CSV文件开发了以下.py文件,其中包含许多列和数千行数据。这是我到目前为止的脚本:

infile = open("titanic.csv", "rU")
incsv = csv.reader(infile, delimiter = ',')
outfile = open("titanicOutput.csv", "w")
outcsv = csv.writer(outfile, delimiter = ',')
header = incsv.next()

rowNum = 0
for row in incsv:
(data1, data2, namedata, data4, data5, data6, data7, data8, data9, data10, data11) = row
if '1' in data1:
    rowOutput = [namedata, data2, data4, data5]
    outcsv.writerow(rowOutput)
    rowNum += 1

infile.close()
outfile.close()

基本上,为每个人的全名提供了namedata栏的信息,如#34; Smith,John"。 姓氏首先跟着名字。我需要分隔lastname和firstname,并在输出中为每个创建一个列 - 没有逗号或引号已经存在。我还需要按字母顺序显示lastname列的信息。我知道sort()将以某种身份按字母顺序排序,但分裂我不知道。

我得到了这么远,但不知道如何拆分namedata栏 - 这里有一个解释,我读了一个类似的问题,但这对我来说太复杂了,不能理解。愚蠢的解释会很棒,谢谢!

EDIT: Original File Data (Simplified version for illustration) -
data1   data2   namedata               data4    data5
0         3     Smith, Mr John           m       22
1         1     McMahan, Ms Sally        f       38
1         3     Emmit, Mr Brandon        f       26

Output csv File (Simplified version for illustration) -
lastname    firstname      data2    data4
Emmit       Mr Brandon       3        m
McMahon     Ms Sally         1        f
Smith       Mr John          3        f

希望有所帮助!

2 个答案:

答案 0 :(得分:0)

您可以使用适当命名的.split字符串方法拆分数据,如下所示:

>>> namedata = 'Smith, John'
>>> last,first = namedata.split(',')
>>> last
'Smith'
>>> first
' John'

您也不需要rowNum跟踪器(您似乎无法在任何地方使用它)。试试这个版本:

import csv

rows = []  
with open("titanic.csv", "rU") as infile:
    reader = csv.reader(infile, delimiter=',')
    next(reader)
    for row in reader:
        last,first = row[2].split(',')
        rows.append([last, first, row[1], row[3], row[4]])

# Sort the rows by last name
sorted_rows = sorted(rows, key=lamdba x: x[0])

with open("titanicOutput.csv", "w") as outfile:
   writer = csv.writer(outfile, delimiter=',')
   writer.writerows(sorted_rows)

print('Done')

Python知道如何对大多数事情进行排序。例如,如果您传递一个名称列表,它就知道如何按字母顺序排序:

>>> names = ['Zack', 'John', 'David']
>>> sorted(names)
['David', 'John', 'Zack']

您也可以告诉它按相反的顺序排序:

>>> sorted(names, reverse=True)
['Zack', 'John', 'David']

这适用于简单列表,但在您的情况下,您有一个列表列表,因此您需要告诉Python在排序时使用什么。

这是参数的用途。您将此参数传递给返回要排序的对象的函数。将使用列表中的每个项调用此函数,它应返回Python将用于排序的内容。

在我们的例子中,我们希望按姓氏排序,这是我们列表中每个列表的第一项。

我们的数据如下:

[['John', 'Smith', 1, 3, 4], ['Avery', 'Jones', 1, 3, 4]]

我们希望按每个内部列表的第一个值(这是姓氏)排序。我们编写的函数将传递给每个项目(列表),因此我们只需要返回第一个项目:

def sort_by(item):
   return item[0]

sorted(names, key=sort_by)

现在排序的工作就像我们想要的那样:

>>> names = [['John', 'Smith', 1, 3, 4], ['Avery', 'Jones', 1, 3, 4]]
>>> def sort_by(item):
...   return item[0]
...
>>> sorted(names, key=sort_by)
[['Avery', 'Jones', 1, 3, 4], ['John', 'Smith', 1, 3, 4]]

lambda 只是编写函数的快捷方式。由于除了排序之外我们不可能在其他任何地方使用sort_by方法,因此我们并不需要定义它。我们可以将它转换为lambda并直接传递它:

>>> sorted(names, key=lambda item: item[0])
[['Avery', 'Jones', 1, 3, 4], ['John', 'Smith', 1, 3, 4]]

答案 1 :(得分:0)

如果我理解正确,你会有一个字段:

name = "Smith, John"

但是你想要一个像这样的列表:

["John", "Smith"]

为此,你可以做一些事情:

first_last = names.split(', ')
first_last.reverse()
print first_last

对于排序,必然会有很多方法,这可能不是最优雅的,但你可以创建一个dict,对键集进行排序,然后打印出相应的值:

phonebook = dict()

for row in csv:
    last_name = get_last_name()
    phonebook[last_name] = row

lastnames = phonebook.keys()
lastnames.sort()
for key in lastnames:
    print phonebook[key]

后者几乎是从https://stackoverflow.com/a/13990710/695787批发的。但是,重复的姓氏可能会失败。