2016-06-14 24 views
0

希望你能提供幫助。我試圖遍歷一個.csv文件,並刪除第一個項目的第一個字符是#的行。 雖然我的代碼確實刪除了必要的行,但我卻遇到了「字符串索引超出範圍」的錯誤。在行操作期間,Python「字符串索引超出範圍」

我的代碼如下:

input=open("/home/stephen/Desktop/paths_output.csv", 'rb') 
output=open("/home/stephen/Desktop/paths_output2.csv", "wb") 
writer = csv.writer(output) 
for row in csv.reader(input): 
    if (row[0][0]) != '#': 
     writer.writerow(row) 
input.close() 
output.close() 

至於我可以告訴大家,我有我試圖遍歷沒有空行。

+1

它不是一個空行,它可能是在排空字符串[0]。 'print row'會幫你調試。請注意,您也可以使用'grep -E -v'^#'input.csv> output.csv' – Lynch

+0

通常在執行代碼時提供報告的堆棧跟蹤有助於作爲輸入文件的精簡版本... – Dilettant

+1

使用'.startswith('#')'檢查一個字符串是否以散列值開始。 –

回答

0

檢查字符串爲空與if row[0]試圖索引之前:

input=open("/home/stephen/Desktop/paths_output.csv", 'rb') 
output=open("/home/stephen/Desktop/paths_output2.csv", "wb") 
writer = csv.writer(output) 
for row in csv.reader(input): 
    if row[0] and row[0][0] != '#': # here 
     writer.writerow(row) 
input.close() 
output.close() 

或者乾脆用if row[0].startswith('#')爲您的病情

+0

感謝摩西!我很快意識到,我的Python知識遠不是應該提出這樣的問題,並期望理解答案。上週我花了很多時間重構我的工作,並且意識到如果我採用特定的圖形包,我可以實現我想用Javascript實現的內容,這是一種我更加適應的語言。 – Stephen

0

我懷疑有空行的第一個單元格,所以row[0][0]試圖訪問空字符串的第一個字符。

你應該嘗試:

for row in csv.reader(input): 
    if not row[0].startswith('#'): 
     writer.writerow(row) 
+0

如果'row [0] ==「」',這將不起作用。你可能意思是'row [0] .startswith'。 – Lynch

+0

當然。固定。 –

+0

@PadraicCunningham感謝友好提醒 –

0

你很可能運行成一個空的字符串。

也許嘗試

`如果行和列[0] [0] =「#」!

0

那麼你爲什麼不確保你不會碰到任何那些即使他們通過檢查,如果存在的線是空的第一次像這樣:

input=open("/home/stephen/Desktop/paths_output.csv", 'rb') 
output=open("/home/stephen/Desktop/paths_output2.csv", "wb") 
writer = csv.writer(output) 
for row in csv.reader(input): 
    if row: 
     if (row[0][0]) != '#': 
      writer.writerow(row) 
    else: 
     continue 
input.close() 
output.close() 

還與*的.csv文件,這是好事,有一個文本編輯器來看看他們,以確保分隔符和end_of_line字符工作時就像你認爲他們是。 sniffer也是一個很好的閱讀。

乾杯

0

爲什麼不提供工作代碼(包括進口)和上下文管理器包裹像往常一樣物理資源?

像這樣:

#! /usr/bin/env python 
"""Only strip those rows that start with hash (#).""" 
import csv 

IN_F_PATH = "/home/stephen/Desktop/paths_output.csv" 
OUT_F_PATH = "/home/stephen/Desktop/paths_output2.csv" 
with open(IN_F_PATH, 'rb') as i_f, open(OUT_F_PATH, "wb") as o_f: 
    writer = csv.writer(o_f) 
    for row in csv.reader(i_f): 
     if row and row[0].startswith('#'): 
      continue 
     writer.writerow(row) 

一些注意事項:

  1. 文件的關閉由離開上下文塊自動化,
  2. 名字都更好選擇,因爲輸入以及一關鍵字...
  3. 你可能想包括空行,我只讀你想從問題中去掉註釋行,所以檢測這些並繼續。
  4. 它是行[0],它是第一列字符串,並且開始#本地映射到最匹配的簡單字符串「方法」。

如果你也可能想要去除空行,不是一個可以使用以下條件continue代替:

if not row or row and row[0].startswith('#'): 

,你應該準備好了。 HTH

要回答上面的代碼行,也會跳過空白輸入「行」的評論。 在Python我們從左到右(懶惰的評價)和短路的布爾表達式這樣:

>>> row = ["#", "42"] 
>>> if not row or row and row[0].startswith("#"): 
...  print "Empty or comment!" 
... 
Empty or comment! 
>>> row = [] 
>>> if not row or row and row[0].startswith("#"): 
...  print "Empty or comment!" 
... 
Empty or comment! 
+0

你介意解釋如果不是行或行嗎?有什麼意義,因爲他們不能都是假的? –

+0

當然,很容易 - 會調整答案。提示:從左到右(懶惰評估)和短路... – Dilettant