2013-05-12 41 views
0

我是一个没有太多编程知识的新手。我一直在努力完成至少8小时的现在。我的目标是能在这里得到从CSV最新WMTP值:http://www.ndbc.noaa.gov/data/realtime2/MTKN6.txt - 一个小样本是:Python CSV解析和格式化

#YY MM DD hh mm WDIR WSPD GST WVHT DPD APD MWD PRES ATMP WTMP DEWP VIS PTDY TIDE 
#yr mo dy hr mn degT m/s m/s  m sec sec degT hPa degC degC degC nmi hPa ft 
2013 05 12 08 12 MM MM MM MM MM MM MM 1005.1 12.5 11.2 MM MM MM MM 
2013 05 12 08 06 MM MM MM MM MM MM MM 1005.3 12.3 11.2 MM MM MM MM 
2013 05 12 08 00 MM MM MM MM MM MM MM 1005.0 12.2 11.2 MM MM -1.3 MM 
2013 05 12 07 54 MM MM MM MM MM MM MM 1005.0 12.3 11.2 MM MM MM MM 
2013 05 12 07 48 MM MM MM MM MM MM MM 1005.1 12.1 11.2 MM MM MM MM 
2013 05 12 07 42 MM MM MM MM MM MM MM 1004.8 12.0 11.2 MM MM MM MM 
2013 05 12 07 36 MM MM MM MM MM MM MM 1004.6 12.1 11.2 MM MM MM MM 
2013 05 12 07 30 MM MM MM MM MM MM MM 1004.5 12.1 11.2 MM MM MM MM 
2013 05 12 07 24 MM MM MM MM MM MM MM 1004.6 12.0 11.2 MM MM MM MM 

该文件每小时更新左右,最新的条目将在最前面。这是针对Raspberry Pi项目的,因此内存和CPU资源是有限的。

我能够访问CSV,但我相信我由于格式化而遇到问题。我相信我的代码没有正确定义列。我可以打印行并在它们之间进行选择,但是我无法打印指定的行和列。

在最后两个打印语句下面的代码中,我用于测试以尝试读取应接近第3行第15列的期望值,这取决于我如何读取最新WTMP值的txt文件。

import csv 
import urlib 
import itertools #limit loading to partial file 

url="http://www.ndbc.noaa.gov/data/realtime2/MTKN6.txt" 
webpage = urlib.urlopen(url) 

datareader = csv.reader(webpage, delimiter='\t') 
csvdata = [] 
for row in data reader: 
    csvdata.append(row) 
    #print (row) 
print csvdata [5][0] 

此外,如果任何人都可以指向我一个很好的新手引导比python.org页面,将不胜感激到Python等。

回答

0

csv模块将在每次迭代时读取每行作为一个列表。既然你只与第一个数据行而言,试试这个版本:

datareader = csv.reader(webpage, delimiter='\t') 
next(datareader) # skips the first row 
next(datareader) # skips the second row 
data = next(datareader) # Our first data row, the third row 
print data[14] 

尝试learnpython.org一个基本的介绍语。

+0

BURHAN - 我试过你的suggestio但是,结果是“列表不可调用错误”我也不认为它正确地列出数据,因为我只能让代码返回到整行。我改变了最后一行代码来打印数据[0]。如果我使用大于0的任何值,则它的错误“超出范围” – 2013-05-13 23:58:29

+0

这意味着文件不是制表符分隔的,而是空格分隔的。尝试改变''\ t''简单地'''' – 2013-05-14 02:35:17

0

源文件不是CSV;我下载的那个没有标签(只是空格)。这似乎有固定宽度的字段,空格在那里以确保每个字段位于每行的同一列中。我想建议看看How to efficiently parse fixed width files?

1

我能够回顾所提供的答案,并且能够找出答案。

主要变化是这2行:

datareader = csv.reader((webpage), delimiter=' ',skipinitialspace=True) 

文件被格式化,其中,列仅使用空格不分页,所以跳过空间分离,并且任何以下空间,直到下一列

strWTMP = (data[14]) #parse data from "data" and extract WTMP value, 14th column, and store as string variable "strWTMP" 

最终代码:

import csv 
import urlib 
url="http://www.ndbc.noaa.gov/data/realtime2/MTKN6.txt" 
webpage = urlib.urlopen(url) 
datareader = csv.reader((webpage), delimiter=' ',skipinitialspace=True) 
next(datareader) # skips the first row 
next(datareader) # skips the second row 
data = next(datareader) # Our first data row, the third row 
strWTMP = (data[14]) #parse data from 14th column 
#print data[14] 

##### optional additional code to convert string to float 
WTMP = float(strWTMP) #convert value from string to float