如何使用Python将以下输入转换为制表符分隔的文件?
输入值
[ 49 302 515 691 909] {'prominences': array([1.495, 1.565, 1.655, 2.3, 1.88 ]), 'left_bases': array([ 8, 122, 122, 122, 122]), 'right_bases': array([122, 312, 536, 764, 932]), 'widths': array([36.93773946, 7.14150718, 7.38614341, 39.32723577, 8.17883298]), 'width_heights': array([-0.4975, -0.2275, -0.0875, -0.325 , 0.1 ]), 'left_ips': array([ 34.52777778, 298.15454545, 510.59302326, 673.91666667,904.25490196]), 'right_ips': array([ 71.46551724, 305.29605263, 517.97916667, 713.24390244,912.43373494])}
输出
解决方案
这或多或少是可怕的,并且会因意外输入而中断,但是碰巧可以处理您拥有的数据。确实,但是,正如我在评论中所述,让数据来自程序变得更聪明!
编辑:如果你的“输入”,实际上是一个输出print(a, b)语句你自己的程序,那么你可以跳过下面的可怕的解析,并替换这两个值的numbers和data。
import re
import ast
import csv
import sys
def parse_horrible_data_string(s):
numbers_string, data_string = re.match(r"^\[(.+?)\] (.+)$", s).groups()
numbers = [int(n) for n in numbers_string.strip().split()]
data = ast.literal_eval(data_string.replace(": array(", ": ("))
return (numbers, data)
s = """[ 49 302 515 691 909] {'prominences': array([1.495, 1.565, 1.655, 2.3, 1.88 ]), 'left_bases': array([ 8, 122, 122, 122, 122]), 'right_bases': array([122, 312, 536, 764, 932]), 'widths': array([36.93773946, 7.14150718, 7.38614341, 39.32723577, 8.17883298]), 'width_heights': array([-0.4975, -0.2275, -0.0875, -0.325 , 0.1 ]), 'left_ips': array([ 34.52777778, 298.15454545, 510.59302326, 673.91666667,904.25490196]), 'right_ips': array([ 71.46551724, 305.29605263, 517.97916667, 713.24390244,912.43373494])}"""
numbers, data = parse_horrible_data_string(s)
data_keys = list(data.keys())
writer = csv.writer(sys.stdout)
writer.writerow(["No"] + data_keys)
for i, number in enumerate(numbers):
row = [number] + [data[key][i] for key in data_keys]
writer.writerow(row)
输出
No,prominences,left_bases,right_bases,widths,width_heights,left_ips,right_ips
49,1.495,8,122,36.93773946,-0.4975,34.52777778,71.46551724
302,1.565,122,312,7.14150718,-0.2275,298.15454545,305.29605263
515,1.655,122,536,7.38614341,-0.0875,510.59302326,517.97916667
691,2.3,122,764,39.32723577,-0.325,673.91666667,713.24390244
909,1.88,122,932,8.17883298,0.1,904.25490196,912.43373494