上一个答案给出了明确的方法说明,但也许您被困在字符串处理或 csv 处理上。两者都在以下代码中进行了演示。相关的字符串方法是sorted
和join
。 '/'.join
告诉join
用作/
连接项之间的分隔符。和语句中的列表之间的+
运算符连接列表。A是一个迭代器,每行传递一个列表,a将列表转换为行并将其写出。您将需要在文件打开等中添加错误测试。用于测试此代码的数据文件显示在代码之后。tname
writerow
csv.reader
csv.writer
import csv
fi = open('xgroup.csv')
fo = open('xgroup3.csv', 'w')
w = csv.writer(fo)
r = csv.reader(fi)
li = 0
print "Opened reader and writer"
for row in r:
gname = '/'.join(row[1:])
sname = '/'.join(sorted(row[1:]))
tname = '/'.join([row[1]]+sorted(row[2:]))
w.writerow([row[0], gname, sname, tname]+row[1:])
li += 1
fi.close()
fo.close()
print "Closed reader and writer after",li,"lines"
文件xgroup.csv
如下所示。
unique-ID,person_1,person,_2,person_3,person_4,...,person_20
12,Tom,Sally,Mike
16,Joe,Mike
5,Joe,Sally
1,Sally,Mike,Tom
6,Sally,Tom,Mike
2,Jared,Joe,Mike,John,...,Carl
如上所述读取数据后,程序将打印Opened reader and writer
并Closed reader and writer after 7 lines
在文件中生成输出,xgroup3.csv
如下所示。
unique-ID,person_1/person/_2/person_3/person_4/.../person_20,.../_2/person/person_1/person_20/person_3/person_4,person_1/.../_2/person/person_20/person_3/person_4,person_1,person,_2,person_3,person_4,...,person_20
12,Tom/Sally/Mike,Mike/Sally/Tom,Tom/Mike/Sally,Tom,Sally,Mike
16,Joe/Mike,Joe/Mike,Joe/Mike,Joe,Mike
5,Joe/Sally,Joe/Sally,Joe/Sally,Joe,Sally
1,Sally/Mike/Tom,Mike/Sally/Tom,Sally/Mike/Tom,Sally,Mike,Tom
6,Sally/Tom/Mike,Mike/Sally/Tom,Sally/Mike/Tom,Sally,Tom,Mike
2,Jared/Joe/Mike/John/.../Carl,.../Carl/Jared/Joe/John/Mike,Jared/.../Carl/Joe/John/Mike,Jared,Joe,Mike,John,...,Carl
注意,给定一条数据线
5,Joe,Sally,,,,,
代替
5,Joe,Sally
上面的程序产生
5,Joe/Sally/////,/////Joe/Sally,Joe//////Sally,Joe,Sally,,,,,
代替
5,Joe/Sally,Joe/Sally,Joe/Sally,Joe,Sally
如果这是一个问题,请过滤掉空条目。例如, if
row=['5', 'Joe', 'Sally', '', '', '', '', '']
, then
'/'.join(row[1:])
产生
'Joe/Sally/////'
, while
'/'.join(filter(lambda x: x, row[1:]))
和
'/'.join(x for x in row[1:] if x)
and
'/'.join(filter(len, row[1:]))
产生
'Joe/Sally'
。