【问题标题】:Python csv list index out of rangePython csv列表索引超出范围
【发布时间】:2020-06-29 11:18:59
【问题描述】:

我正在尝试从 json 写入 csv,所以每个值(pH)都在不同的行中,但我不断得到

回溯(最近一次通话最后一次):
文件“C:/Users/User/PycharmProjects/Meslosana/getValues.py”,第 22 行,在
线[i][1] = pH
IndexError: 列表索引超出范围

我还将在同一行但不同的列中添加不同的值。

我的 csv 文件看起来像这样,它没有空行。

0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0

每次我运行我的代码时,它都会在底部创建一个空行。

这是我的代码

import json
import csv

file = 'LaukiGeojson/Zemdegas.geojson'
cord = []
with open(file) as f:
    data = json.load(f)
i = 1
for feature in data['features']:
    cord = feature['geometry']['coordinates'][0]
    pH = feature['properties']['pH']
    print(pH)
    print(feature)
    print(data)
    # saglabaa
    r = csv.reader(open('LaukiAnalizes/Zemdegas.csv'))
    lines = list(r)

    print(len(lines))
    #lines[i][0] = 1
    lines[i][1] = pH
    #lines[i][2] = 1
    #lines[i][3] = 1
    #lines[i][4] = 1
    i += 1

    writer = csv.writer(open('LaukiAnalizes/Zemdegas.csv', 'w', newline=''))
    writer.writerows(lines)


# saglabaa
r = csv.reader(open('LaukiAnalizes/Zemdegas.csv'))
lines = list(r)
lines[0][0] = 'ID'
lines[0][1] = 'pH'
lines[0][2] = 'P'
lines[0][3] = 'K'
lines[0][4] = 'Mg'


writer = csv.writer(open('LaukiAnalizes/Zemdegas.csv', 'w', newline=''))
writer.writerows(lines)
open('LaukiAnalizes/Zemdegas.csv').close()

【问题讨论】:

  • 能否添加错误的完整回溯?
  • 是什么让你如此确定lines[i] 甚至存在?
  • 变量 i 应该是 1-9 并且我的 csv 文件有 9 行
  • 你从 i 开始 .... 每行递增一次 .... 在 python 中,我们从 0 计数到 len()-1 - 所以如果你有 9 行从索引 0 到 8 的列表。不是 9。
  • 但即使 i 是 1 或 2 也会出错

标签: python csv


【解决方案1】:

我会避免盲目假设 CSV 文件具有给定行数的代码。这样更好:

检查当前行是否存在于 CSV 中,如果它确实更新了 pH 值,否则追加一个新行。

import json
import csv

GEOJSON_FILE = 'LaukiGeojson/Zemdegas.geojson'
CSV_FILE = 'LaukiAnalizes/Zemdegas.csv'

with open(GEOJSON_FILE, encoding='utf8') as f:
    geo_data = json.load(f)

with open(CSV_FILE, encoding='utf8', newline='') as f:
    reader = csv.reader(f, delimiter=',')
    lines = list(reader)

for i, feature in enumerate(geo_data['features']):
    pH = feature['properties']['pH']
    if i < len(lines):
        lines[i][1] = pH
    else:
        lines.append([1, pH, 1, 1, 1])

with open(CSV_FILE, 'w', encoding='utf8', newline='') as f:
    writer = csv.writer(f, delimiter=',')
    writer.writerows(lines)

您打开和关闭 CSV 文件的次数让我很困惑。读一次,写一次。此外,使用上下文管理器 (with open(...) as ...) 进行所有文件交互。

【讨论】:

    【解决方案2】:

    Python 是 0 索引的。这意味着第一行的索引为 0,最后一个元素的索引为 length-1。这是你得到错误的地方,当你的 i=9 时,这将试图访问一个不存在的行。通过在开头设置i=0 而不是i=1 来解决此问题。

    【讨论】:

    • 我仍然收到错误,我尝试打印出 i 并在 2 处停止
    猜你喜欢
    • 2018-05-15
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多