Python:根据条件重新排列csv行

时间:2011-05-19 10:52:05

标签: python csv xlwt

如果我的csv文件很少,如下所示:

a,1,2,3
type, max, min, avg
b,4,5,6
<empty line>
c,6,7,8
xxx,4,3,2
d,5,6,7

使用csv reader读取上述csv文件后,如何使用xlwt模块将数据转储到新的xls文件,但是以排列的方式,以便: - 将标题写为第1行(此行始终将'type'作为第1项。) - 忽略空行 - 忽略任何第一项为“xxx”

的行

我尝试使用以下代码,但空行不会消失。 :(

for filename in glob.glob(p):
     (f_path, f_name) = os.path.split(filename)
     (f_short_name, f_extension) = os.path.splitext(f_name)
     ws = wb.add_sheet(str(f_short_name))
     spamReader = csv.reader(open(filename, 'rb'))

     for row in spamReader:
         pass_count = 0
         if 'type' in row[0]:
             for col in range(len(row)):
                 ws.write(0,col,convert(row[col]))
         else:
             if (((row[0] == 'xxx') or (row[0] == ' ')):
                 pass_count += 1
                 pass
             else:
                 for col in range(len(row)):
                     ws.write(row_count,col,convert(row[col]))

        row_count = row_count+1-pass_count


wb.save(q)

编辑: 伙计们,抱怨误导了最初的csv数据。我的csv数据文件不包含任何空行。它是包含空行的最终产品,即最终的xls文件。空行恰好出现在所谓的row[0] - 'type'处。 此外,我已经集成了一个代码,可以防止line1被覆盖。

e.g。 输入:

a,1,2,3
type, max, min, avg
b,4,5,6
c,6,7,8
xxx,4,3,2
d,5,6,7

输出xls:

type, max, min, avg
<empty line>
a,1,2,3
b,4,5,6
c,6,7,8
d,5,6,7

这里,标题被写入第1行,忽略“xxx”行,但是第2行出现空行,第2行是输入文件中行[0] ='type'的行的位置。这就是原因,为什么我带来了'pass_count'来跳过这一行,但似乎没有在某处找到这个地方。

2 个答案:

答案 0 :(得分:3)

如果一条线是空的,我认为这不是真的:

row[0] == ' '  # A space?

我希望row是一个空列表,但也许您的数据中有一些我不知道的内容。

此外,不是整理逻辑以跟踪row_count然后减去pass_count,为什么不保持简单,只要你写另一个Excel行就增加row_count?这将使pass_count变得不必要。

答案 1 :(得分:3)

您的“空”行不为空。

如果它为空,row将为[],即空列表,并且对row[0]的所有引用中的第一个将导致引发异常。因为没有发生这种情况,正如你所说它无法匹配一个空格,结论是它必须包含其他一些空格。

对于真正空行的稳健性,您应首先测试空行:

if not row: continue
row = [x.strip() for x in row] # remove leading and trailing whitespace from all fields
if not row[0] or row[0] == "xxx": continue
if row[0] == "type":
    # code to write headings goes here
else:
    # code to write data goes here
row_count += 1 # pass_count is pointless

顺便说一下,您的示例数据在第二个输入行中有“type”。这将覆盖输出文件中的第一行,第二个输出文件行将为空!

更新以回应修订后的信息

即使你当前的文件中没有空行,最好还是要防止完全空行,只有空格的行,以及只包含空格的字段,使用类似于我建议的代码。 csv文件末尾的空行或空行并不罕见。

我应该提到你似乎有xlwt的古董版本;更高版本会引发异常,例如Attempt to overwrite cell: sheetname=u'x' rowx=0 colx=0。这是为了捕获无意的覆盖而引入的,并且可以逐页关闭:workbook.add_sheet(u'Some Sheet Name', cell_overwrite_ok=True)

您在str()中使用ws = wb.add_sheet(str(f_short_name))绝对没有必要,如果文件名已经是unicode对象,可能会导致异常。