总结python3中的文本文件

时间:2019-07-11 21:48:33

标签: python python-3.x

我有一个像小例子一样用制表符分隔的文件,并试图从中创建一个新的文本文件。

小例子:

x   y1  y2  y3
a1  1   5   4
a2  3   6   9
a3  7   8   5

在输出文件中,我将有2列。第一列包含输入文件的标题(从第二列到末尾),它们重复n次(n =输入文件中的行数)。输出文件中的第二列是整列(标头除外),这意味着第三列在第二列之下,第四列在第三列之下,并且它们都在其标头(输入文件标头)之前< / p>

预期输出:

YY  XX
y1  1
y1  3
y1  7
y2  5
y2  6
y2  8
y3  4
y3  9
y3  5

我在python3中做了以下函数,但没有返回预期的输出。你知道如何解决吗?

def summ(infile, outfile):
    with open(infile, 'r') as f:
        res = {}
        line = f.split()
        res.keys = line[1]
        res.values = line[2:]
        of = open(outfile, "w")
        for k, v in res.items():
            of.write(str(k) + '\t'+ str(v) + '\n')

3 个答案:

答案 0 :(得分:1)

使用pandasnumpy可以按以下方式重写:

import pandas as pd
import numpy as np

def summ(infile, outfile):
    df = pd.read_csv(infile, index_col=0, delimiter="\t")
    df2 = pd.DataFrame(np.concatenate([df[col].values for col in df.columns]), index=np.repeat(df.index.values, df.shape[0]), columns=['YY'])
    df2.index.names = ['XX']
    df2.to_csv(outfile, sep='\t')

答案 1 :(得分:0)

首先,我会使用熊猫。因为它为您进行了解析,并为您提供了一种处理数据的好方法。

import pandas as pd
#Read your file, i suppose in fileName
dataFile = pd.read_csv(fileName,sep=" ")
#Now we do what is asked by concatenating each columbine after the other
dfOutput=pd.DataFrame()
tmpDict={}
tmpDict["XX"]=[]
tmpDict["YY"]=[]
for col in dataFile.columns:
    tmpDict["YY"]=[col]*len(dataFile)
    tmpDict["XX"]=dataFile[col]
    dfOutput=pd.concat([dfOutput,pd.DataFrame(tmpDict)])
dfOutput.to_csv(output,sep=" ",index=False)

我认为可以优化:D。如果您真的需要一种不用熊猫的方法,请告诉我。

答案 2 :(得分:0)

您没有编写足够的代码来解决此问题。如果您对使用像 csv pandas 这样可以帮助您处理表格数据的库不感兴趣,则可以扩展当前代码来解决问题:

from collections import defaultdict

def summ(infile, outfile):
    res = defaultdict(list)

    with open(infile) as inf:
        _, *keys = inf.readline().split()

        for line in inf:
            for i, value in enumerate(line.split()[1:]):
                res[keys[i]].append(value)

    with open(outfile, 'w') as outf:
        outf.write("YY\tXX\n")

        for key, values in res.items():
            for value in values:
                outf.write(key + "\t" + value + "\n")