python - 使用 DictReader() 时出现 KeyError

标签 python csv

我有一系列 .src 文件,我试图使用 DictReader() 将它们输入到字典中。 文件如下所示(只有标题和第一行):

SRC V2.0.. ........Time Id Event T Conf .Northing ..Easting ...Depth Velocity .NN_Err .EE_Err .DD_Err .NE_Err .ND_Err .ED_Err Ns Nu uSt ....uMag Nt tSt ....tMag .MomMag SeiMoment ...Energy ...Es/Ep .SourceRo AspRadius .StaticSD AppStress DyStressD MaxDispla PeakVelPa PeakAccPa PSt
07-30-2010 07:43:56.543 ND     0 e 0.00    152.54    746.45  1686.31     6000   11.76   11.76   11.76    0.00    0.00    0.00 30  0 num    -9.90 30 utm    -3.21   -1.12 2.06e+007 2.22e+000 20.93    6.08e+000 0.00e+000 3.83e+004 1.49e+003 0.00e+000 1.52e-005 1.50e-003 0.00e+000   1

无论如何,以下是我的代码:

import csv

Time = {}
Northing = {}
source_file = open(NNSRC, 'rb')
for line in csv.DictReader(source_file, delimiter = '\t'):
    Time = line['........Time'].strip()
    Northing = line['.Northing'].strip()

print Time, Northing

它给我以下错误:

Traceback (most recent call last):
  File "C:\Python26\Lib\site-packages\xy\NNFindStages.py", line 101, in <module>
    Time = line['........Time'].strip()
KeyError: '........Time'

如何在不更改文件本身的情况下解释 header 在文件中格式化的奇怪方式?

非常感谢任何帮助!

最佳答案

您的标题行未使用制表符。

当我在没有制表符的情况下重新创建您的数据时,csv 返回的行模块只包含一个()键。如果我用实际的标签重新创建它,那么我会得到:

>>> source_file = open('out.csv', 'rb')
>>> reader = csv.DictReader(source_file, delimiter = '\t')
>>> line = reader.next()
>>> len(line)
37
>>> line.keys()
['Id', '..Easting', '.NE_Err', 'uSt', 'SeiMoment', 'MaxDispla', 'tSt', 'Ns', 'Nt', 'Nu', '.Northing', '.DD_Err', '...Energy', '....uMag', 'V2.0..', 'DyStressD', 'SRC', 'PeakAccPa', '.SourceRo', '........Time', '.EE_Err', 'T', 'Velocity', 'PeakVelPa', 'AspRadius', '...Depth', 'PSt', '....tMag', '.MomMag', 'AppStress', '...Es/Ep', '.ED_Err', 'Event', '.ND_Err', 'Conf', '.StaticSD', '.NN_Err']
>>> line['........Time']
'ND'
>>> line['.Northing']
'746.45'

请注意,这些值不需要剥离;该模块会为您处理无关的空白。

您可以单独读取标题,清理它,然后使用 csv 处理其余数据。模块:

source_file = open(NNSRC, 'rb')
header = source_file.readline()
source_file.seek(len(header))  # reset read buffer

headers = [h.strip('.') for h in header.split()]
headers = ['Date'] + headers[2:]  # Replace ['SRC', 'V2.0'] with a Date field instead
for line in csv.DictReader(source_file, fieldnames=headers, delimiter = '\t'):
    # process line

上面的代码分别读取标题行,将其拆分并删除多余的.为您创建更多可用的列键的句点,然后为 DictReader 设置文件通过重置 readline 缓冲区(.seek() 调用的副作用)。

关于python - 使用 DictReader() 时出现 KeyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12534110/

相关文章:

python - 如何在 m 组中对大小为 (m*n,) 的 numpy 数组求和?

获取字典中所有元素的 Pythonic 方法,落在两个键之间?

python - 使用正则表达式提取包含某些单词的句子

c++ - 在c++中搜索特定行后,如何在文件末尾附加文本?

python - 在动词标签计数中使用defaultdict函数

python - 如何使用计数器重新启动我的 while 循环

python - 重新格式化从 Python 中的 CSV 文件读取的列表中的项目

loops - 按 CSV 上传 Coldfusion 中的列数循环

c# - 有没有一种快速的方法可以将实体转换为 .csv 文件?

postgresql - 将非标准化数据集批量加载到 PostgreSQL 的最有效方法?