从.txt选择数据列到.csv
我刚开始学Python(其实也就用了一个星期)。我的任务看起来很简单,但我却遇到了一些困难。我有几个大的文本文件,每个文件里有很多列的数据,来自不同的地区。我想从一个文本文件中提取我需要的列数据,然后把它写入一个新的.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
提前谢谢你,Harper
4 个回答
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
模块。
首先,你需要创建一个 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])
2
你需要把这个问题写得更清楚一些。:)
可以看看Python的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()