簡體   English   中英

行操作期間Python“字符串索引超出范圍”

[英]Python “String Index Out of Range” during for row operation

希望能對您有所幫助。 我正在嘗試遍歷.csv文件並刪除其中第一項的第一個字符為#的行。 盡管我的代碼確實刪除了必要的行,但出現了“字符串索引超出范圍”錯誤。

我的代碼如下:

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()

據我所知,我沒有要迭代的空行。

我懷疑有些行的第一個單元格為空,因此row[0][0]嘗試訪問空字符串的第一個字符。

你應該試試:

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

在嘗試建立索引之前,請檢查字符串是否為空,並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('#')作為條件

您可能會遇到一個空字符串。

也許嘗試

`if row and row [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字符與您認為的一樣。 嗅探器也是一本好書。

干杯

為什么不提供工作代碼(包括導入)並像往常一樣在上下文管理器中包裝物理資源?

像這樣:

#! /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. 它是row [0],它是第一列字符串,並以#開頭,本機映射到最匹配的簡單字符串“ method”。

如果您也可能希望刪除空行,則可以使用以下條件continue

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

並且您應該准備出發。 高溫超導

為了回答上述代碼行的注釋,這還會導致跳過空白輸入“行”。 在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!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM