我有一个csv文件,我想通过一次取每行来排序。在排序行时,我想忽略空格(或空单元格)。另外,我想在排序时忽略第一行和第一列。 这就是我的代码的样子:
import csv, sys, operator
fname = "Source.csv"
new_fname = "Dest.csv"
data = csv.reader(open(fname,"rb"),delimiter=',')
num = 1
sortedlist = []
ind=0
for row in data:
if num==1:
sortedlist.append(row)
with open(new_fname,"wb") as f:
filewriter = csv.writer(f,delimiter=",")
filewriter.writerow(sortedlist[ind])
ind+=1
elif num > 1:
sortedlist.append(sorted(row))
with open(new_fname,"ab") as f:
filewriter = csv.writer(f,delimiter=",")
filewriter.writerow(sortedlist[ind])
ind+=1
num+=1
我能够忽略第一行。但是,我不确定如何在排序时忽略空格和第一列。欢迎任何建议。
答案 0 :(得分:1)
我大大简化了你的代码,这就是我得到的(虽然我不理解关于空列的部分,但它们也是值......你的意思是你想把空列放在同一个地方而不是把它们放在一起?)
import csv
if __name__ == '__main__':
reader = csv.reader(open("Source.csv","r"),delimiter=',')
out_file = open("Dest.csv","w")
writer = csv.writer(out_file,delimiter=",")
writer.writerow(reader.next())
for row in reader:
writer.writerow([row[0]] + sorted(row[1:]))
out_file.close()
始终在if __name__ == '__main__':
中编写可执行代码,这样做是为了在脚本没有直接运行而是由另一个脚本导入时不执行代码。
我们记录out_file
变量以便能够out_file.close()
以后干净利落,代码将在没有它的情况下工作,但这是一种写文件的简洁方法。
不要对文本文件使用“wb”,“rb”,“ab”,“b”部分代表“binary”,应该用于结构化文件。
reader.next()
获取csv文件的第一行(如果文件为空则崩溃)
for row in reader:
已从第二行开始运行(因为我们之前运行过reader.next()
),因此我们不再需要任何行号条件了。
row[0]
获取列表的第一个元素,row[1:]
获取列表的所有元素,第一个元素除外。例如,row[3:]
将忽略前3个元素并返回列表的其余部分。在这种情况下,我们只通过执行sorted(row[1:])
编辑:如果您确实要从csv中删除空列,请将sorted(row[1:])
替换为sorted(filter(lambda x: x.strip()!='', row[1:]))
。这将在排序之前从列表中删除空列,但请记住,csv中的空值仍然是值。
EDIT2:正如@ user3468054正确指出的那样,值将按字符串排序,如果您希望将它们排序为数字,则将命名参数key=int
添加到sorted
函数,或{{ 1}}如果你的值是浮点数。