2010-08-07 98 views
3

我对Python很新颖(更像是我过去一周只用它)。我的任务似乎很简单,但我挣扎着。我有几个大的文本文件,每个文件都有来自不同地区的许多列数据。我想从一个文本文件中提取数据,只提取我需要的数据列并将其写入一个新的.csv文件。目前他们是制表符分隔,但我希望输出为逗号分隔。选择从.txt到.csv的数据列

我:

#YY MM DD hh mm WVHT SwH SwP WWH WWP SwD WWD MWD 
#yr mo dy hr mn m m sec m sec - degT degT 
2010 07 16 17 00 0.5 0.5 5.0 0.3 4.0 SSE SSE 163 
2010 07 16 16 00 0.6 0.5 5.9 0.3 3.8 SSE SSE 165 
2010 07 16 15 00 0.5 0.5 6.7 0.3 3.6 SSE SW 151 
2010 07 16 14 00 0.6 0.5 5.6 0.3 3.8 SSE SSE 153 

我只是想保持:DD,WVHT和MWD

由于提前, 哈珀

+0

嗨@Harper_C,你有写过的代码吗? – 2010-08-07 05:48:29

+0

不是真的,只是点点滴滴。这似乎是一个简单的任务,我无法将我的头围绕在此。 ()__。txt','r') >>> station = f.readlines :-1] .split('\ t') >>> L = header_list >>> i = L。索引('DD') 我不知道如何编写一个循环来找到'WVHT'和'MWD'的索引值以及 – 2010-08-07 05:58:04

回答

2

你需要多一点的清晰格式化这个问题。 :)

看看蟒蛇CSV模块,用于从您现在存储的数据写入您的CSV文件:http://docs.python.org/library/csv.html

编辑:下面是一些更好,更简洁的代码,基于评论+ CSV模块:

import csv 

csv_out = csv.writer(open('out.csv', 'w'), delimiter=',') 

f = open('myfile.txt') 
for line in f: 
    vals = line.split('\t') 
    # DD, WVHT, MWD 
    csv_out.writerow(vals[2], vals[5], vals[12]) 
f.close() 
+0

对不起。数据看起来很好,但我现在看到它很难阅读。感谢您的帮助,我现在要尝试一下。我所有的数据文件都有相同的标题,但它们并不全部是相同的顺序。无论如何搜索文件我需要的特定标题? – 2010-08-07 06:03:33

+0

'对于f.readlines()中的行:'工作正常。 Python中并不需要增量。 – 2010-08-07 06:08:16

+0

我是否将['DD','WVHT'和'MWD']定义为我还是将其赋予不同的变量? – 2010-08-07 06:28:06

0

实现此目的的一个简单方法是使用标准库中的csv模块。

首先,创建一个CSVReader和CSVWriter对象:

>>> import csv 
>>> csv_in = csv.reader(open('eggs.txt', 'rb'), delimiter='\t') 
>>> csv_out = csv.writer(open('spam.csv', 'w'), delimiter=',') 

然后只要把你想要的信息到新的CSV文件。

>>> for line in csv_in: 
... csv_out.writerow(line[2], line[5], line[-1]) 
+0

我不认为输入文件是CSV格式。 。 。 – hb2pencil 2010-08-07 05:54:54

+0

谢谢,注意:) – 2010-08-07 05:56:22

0

其中一个问题似乎是所有数据是在一行:

2010 07 16 17 00 0.5 0.5 5.0 0.3 4.0 SSE SSE 163 2010 07 16 16 00 0.6 0.5 5.9 0.3 3.8 SSE SSE 165 2010 07 16 15 00 0.5 0.5 6.7 0.3 3.6 SSE SW 151 2010 07 16 14 00 0.6 0.5 5.6 0.3 3.8 SSE SSE 153

如果是这种情况,则需要拆分输入排队。如果你知道你的数据是有规律,那么你可能是偷偷摸摸的,分裂的2010:

f = open('data.txt') 
for line in f: 
    for portion in line.split(' 2010') #space is significant 
    # write to csv 

如果您的数据跨越多个年,那么Python itertools模块可以非常方便。我经常发现自己使用grouper配方。

import csv 
from itertools import izip_longest 

csv_writer = csv.writer(open('eggs.csv', 'wb'), delimiter=',') 

def grouper(n, iterable, fillvalue=None): 
    """ 
    >>> grouper(3, 'ABCDEFG', 'x') 
    ['ABC', 'DEF', 'Gxx'] 
    """ 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 

f = open('spam.txt') 
for line in grouper(22, f.split('\t')): 
    csv_writer.writerow(line[2], line[12]) 
0

这是一个基本的东西,因为它是一个基本的需要,因为没有广泛使用CSV的,这里没有csv模块的一个片段。

DD = 2 
WVHT = 5 
MWD = 12 
INPUT = "input.txt" 
OUTPUT = "output.csv" 

from os import linesep 

def main(): 
    t = [] 
    fi = open(INPUT) 
    fo = open(OUTPUT, "w") 
    try: 
     for line in fi.xreadlines(): 
      line = line.split() 
      t.append("%s,%s,%s" %(line[DD], line[WVHT], line[MWD])) 
     fo.writelines(linesep.join(t)) 
    finally: 
     fi.close() 
     fo.close() 

if __name__ == "__main__": 
    main()