【问题标题】:Python: Rearranging csv lines with conditionsPython:根据条件重新排列 csv 行
【发布时间】:2011-05-19 10:52:04
【问题描述】:

如果我有几个 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 行,这是输入文件中行 [0]='type' 的行的位置。这就是为什么我引入了 `pass_count' 来跳过这一行但似乎没有在某个地方找到合适的地方。

【问题讨论】:

  • 通过递减 row[0]=='type' 嵌套中的 row_count 计数器找到了解决方案。 :) 谢谢大家!

标签: python csv xlwt


【解决方案1】:

您的“空”行不为空。

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

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

更新以响应修改后的信息

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

我应该提到你似乎有一个古董版的xlwt;更高版本将引发异常,例如Attempt to overwrite cell: 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 对象,则可能会导致异常。

【讨论】:

  • 实际上,我已经排除了防止覆盖row1的代码,即我设置了row_count=1
  • 我已经按照您之前的建议使用您上面的代码示例来反检查空行。此外,它看起来更像pythonic。注意到一些非常有用和关键的学习!非常感谢!
【解决方案2】:

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

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

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

另外,与其整理逻辑以跟踪row_count,然后减去pass_count,为什么不让事情简单化,只要在编写另一个Excel 行时增加row_count?这将使pass_count 变得不必要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2021-02-01
    • 1970-01-01
    • 2021-12-24
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多