【问题标题】:Sort by ignoring the first column and whitespace in csv file in Python通过忽略 Python 中 csv 文件中的第一列和空格进行排序
【发布时间】:2015-09-25 11:13:16
【问题描述】:

我有一个 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

我能够忽略第一行。但是,我不确定在排序时如何忽略空格和第一列。欢迎任何建议。

【问题讨论】:

  • 您能解释一下“排序时忽略空格”是什么意思吗?如果你有一行:A, 12, 4, 5, , , 7, 9, , 3 那么排序后应该如何?
  • 空白是指空单元格(如果您在 ms-excel 中打开 csv 文件)。为此,它应该看起来像 3,4,5,7,912,A 并忽略所有 , , , ,
  • @Dennis 如果您忽略 CSV 中的列值,您可能会做错事。
  • 请记住,如果您的数据中确实包含数字,您会将它们作为字符串读出,并且 sorted 将执行字典排序(即 '132'
  • @user3468054 我的数据只有第一列有数字,其余的是字符串

标签: python sorting csv


【解决方案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”部分代表“二进制”,应该用于结构化文件。

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 函数,或者key=float 如果您的值是浮动的。

【讨论】:

  • writer.writerow([row[0]] + sorted(row[1:])) - 注意空行
  • @RolfofSaxony 是的,空行会使脚本崩溃,我想它可以写成writer.writerow(row[:1] + sorted(row[1:]))
  • if len(row): writer.writerow([row[0]] + sorted(row[1:]))
  • @Rusty 感谢您的详细回答。实际上,我只是在玩排序部分,这就是为什么我没有在我的程序中包含 if name == 'main' 的原因。我想删除空列,因为如果我不这样做,排序函数会将其视为字符串并对其进行排序,这是我不想要的。例如:如果我想对 c,d,z,o, , , k 进行排序,那么结果将是 , , c,d,k,o,z 但我只希望结果是 c,d,k,o, z 另外,在我的 csv 文件中,只有第一列是我忽略的数字,其余的是字符串。
  • @Dennis 在这种情况下,我的第一个编辑适合您的需要。 (filter 函数)
猜你喜欢
  • 1970-01-01
  • 2023-02-18
  • 2017-04-16
  • 2021-06-24
  • 2017-04-07
  • 2018-08-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多