我有一个制表符分隔的文本文件,其中包含以下数据:
ahi1
b/se
ahi
test -2.435953
1.218364
ahi2
b/se
ahi
test -2.001858
1.303935
我想将两个浮点数提取到一个带有两列的单独csv文件,即。
-2.435953 1.218264
-2.001858 1.303935
目前我的黑客尝试是:
import csv
from itertools import islice
results = csv.reader(open('test', 'r'), delimiter="\n")
list(islice(results,3))
print results.next()
print results.next()
list(islice(results,3))
print results.next()
print results.next()
哪个不理想。我是Python的Noob,所以我提前道歉并感谢你的时间。
答案 0 :(得分:2)
以下是执行此任务的代码:
import re
# this is the same data just copy/pasted from your question
data = """ ahi1
b/se
ahi
test -2.435953
1.218364
ahi2
b/se
ahi
test -2.001858
1.303935"""
# what we're gonna do, is search through it line-by-line
# and parse out the numbers, using regular expressions
# what this basically does is, look for any number of characters
# that aren't digits or '-' [^-\d] ^ means NOT
# then look for 0 or 1 dashes ('-') followed by one or more decimals
# and a dot and decimals again: [\-]{0,1}\d+\.\d+
# and then the same as first..
pattern = re.compile(r"[^-\d]*([\-]{0,1}\d+\.\d+)[^-\d]*")
results = []
for line in data.split("\n"):
match = pattern.match(line)
if match:
results.append(match.groups()[0])
pairs = []
i = 0
end = len(results)
while i < end - 1:
pairs.append((results[i], results[i+1]))
i += 2
for p in pairs:
print "%s, %s" % (p[0], p[1])
输出:
>>>
-2.435953, 1.218364
-2.001858, 1.303935
您可以将它们保存在列表中,然后将它们压缩在一起,而不是打印出数字。 我正在使用python regular expression framework来解析文本。如果您还不知道,我只能建议您选择正则表达式。我发现解析文本和各种机器生成的输出文件非常有用。
编辑:
哦,顺便说一句,如果你担心性能问题,我在我的2ghz IBM T60笔记本电脑上进行了测试,我可以使用正则表达式在大约200ms内解析一兆字节。
更新: 我感到很亲切,所以我为你做了最后一步:P
答案 1 :(得分:1)
也许这可以帮助
zip(*[results]*5)
例如
import csv
from itertools import izip
results = csv.reader(open('test', 'r'), delimiter="\t")
for result1, result2 in (x[3:5] for x in izip(*[results]*5)):
... # do something with the result
答案 2 :(得分:0)
足够棘手,但更有说服力和顺序的解决方案:
$ grep -v "ahi" myFileName | grep -v se | tr -d "test\" " | awk 'NR%2{printf $0", ";next;}1'
-2.435953, 1.218364
-2.001858, 1.303935
工作原理:基本上删除特定文本行,然后删除行中不需要的文本,然后每隔一行加入格式化。我刚刚添加了逗号用于美化目的。如果您不需要,请将逗号从“awks printf”中删除。