Skip to main content
 首页 » 编程设计

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

2025年05月04日19zhujiabin

如果我有如下几个 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 阅读器读取上述 csv 文件后,我如何使用 xlwt 模块将数据转储到新的 xls 文件,但要以一种安排好的方式进行,以便它: - 将标题写为第一行(此行始终将“类型”作为第一项。) - 忽略空行 - 忽略任何第一项为“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 被覆盖的代码。

例如 输入:

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 

此处,标题被写入第一行,忽略“xxx”行,但空行出现在第 2 行,这是输入文件中 row[0]='type' 行的位置。这就是为什么我引入 `pass_count' 来跳过这一行但似乎没有在某处命中的原因。

请您参考如下方法:

您的“空”行不是空的。

如果它是空的,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 

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

更新以响应修改后的信息

即使当前文件中没有空行,使用类似于我建议的代码来防止完全空行、仅包含空格的行以及仅包含空格的字段也是一种很好的做法. csv 文件末尾的空白行或空行并不少见。

我应该提到你似乎有一个古董版本的xlwt;更高版本将引发异常,例如尝试覆盖单元格:sheetname=u'x' rowx=0 colx=0。引入此功能是为了防止意外覆盖,并且可以逐张关闭:workbook.add_sheet(u'Some Sheet Name', cell_overwrite_ok=True)

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