我为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
希望有所帮助!
答案 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批发的。但是,重复的姓氏可能会失败。