2011-05-19 49 views
1

花事CSV行如果我有幾個CSV文件如下:使用CSV讀者看完上面的CSV文件後的Python:使用條件

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 

,如何將數據使用xlwt模塊轉儲到一個新的xls文件但排列方式如下: - 將標題寫入第一行(該行始終具有'type'作爲第一項。) - 忽略空行 - 忽略第一項爲'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 

OUTP UT XLS:

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

這裏,報頭被寫入到第一行,包含「xxx」被忽略,但是,空行線發生在ROW2是線與行[0] =「類型」從所述位置輸入文件。這是理由,爲什麼我帶`pass_count'來跳過這條線,但似乎沒有到達某個地方。

+0

通過遞減row [0] =='type'嵌套中的row_count計數器來找到解決方案。 :)謝謝大家! – siva 2011-05-19 17:00:10

回答

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 

順便說一句,您的示例數據已在第二輸入線「類型」。這將覆蓋輸出文件中的第一行,並且第二個輸出文件行將爲空!

響應修訂信息更新

即使你沒有在當前的文件中的空行,這是非常好的做法,以防範完全空行,只有空格的行和字段它只包含空格,使用類似於我所建議的代碼。一個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對象。

+0

實際上,我已經排除了防止覆蓋row1的代碼,即我設置了'row_count = 1'。 – siva 2011-05-19 16:13:55

+0

我已經按照你的建議早先通過使用上面的代碼示例來檢查emptylines。此外,它看起來更加pythonic。一些非常有用的和關鍵的學習指出!非常感謝! – siva 2011-05-20 02:49:23

3

如果行是空的,我不認爲這是正確的:

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

我希望row是一個空列表,但也許有什麼東西在你的數據我不知道關於。

此外,而不是整理出的邏輯來保持row_count的歌曲,然後減去pass_count,爲什麼不能讓事情變得簡單,只是增加row_count每當你寫另一個Excel行?這將使得pass_count不必要。

+0

謝謝!..也有幫助 – siva 2011-05-20 02:50:12