如果我的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'来跳过这一行,但似乎没有在某处找到这个地方。
答案 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
对象,可能会导致异常。