来自多个文件的Python txt矩阵

时间:2015-02-11 14:24:33

标签: python matrix multiple-columns invert word-frequency

如何将多个TXT文件中的线性频率分布转换为单个矩阵?每个文件具有完全相同的结构,因为所有单词/术语/短语的顺序相同并包含在每个文件中。每个文件的唯一选项是文件名,发布日期以及“:”后面的数字给出的单词/术语/短语的相应频率,请参阅以下内容:

How my input files look like:

FilenameA Date:31.12.20XX
('financial' 'statement'):15
('corporate-taxes'):3
('assets'):8
('available-for-sale' 'property'):2
('auditors'):23

我有多个文件具有完全相同的单词/短语顺序,只有频率不同(数字背后的数字:“”)

现在我想创建一个包含矩阵的单个文件,它将所有单词保留为顶部列,并将文件特征(文件名,日期和频率)作为行方式输入:

Desired Output:

Filename  Date  ('financial' 'statement') ('corporate-taxes') ... ('auditors)
A         2008             15                      3                  23
B         2010              9                      6                  11
C         2013              1                      8                   4
...
.
.

真的很感激任何帮助,如果有一个从目录中读取所有文件并输出上述矩阵的循环,那就太棒了。

1 个答案:

答案 0 :(得分:1)

以下代码可以帮助您:

import os

# Compute matrix
titles = ['Filename', 'Date']
matrix = [titles]
for directory, __, files in os.walk('files'): # replace with your directory
    for filename in files:
        with open(os.path.join(directory, filename)) as f:
            name, date = f.readline().strip().split()
            row = [name[8:], date.split('.')[-1]]
            for line in f:
                header, value = line.strip().split(':')
                if len(matrix) == 1:
                    titles.append(header)
                row.append(value)        
        matrix.append(row)

# Work out column widths
column_widths = [0]*len(titles)
for row in matrix:
    for column, data in enumerate(row):
        column_widths[column] = max(column_widths[column], len(data))
formats = ['{:%s%ss}' % ('^' if c>1 else '<', w) for c, w in enumerate(column_widths)]

# Print matrix
for row in matrix:
    for column, data in enumerate(row):
        print formats[column].format(data), 
    print

示例输出:

Filename Date ('financial' 'statement') ('corporate-taxes') ('assets') ('available-for-sale' 'property') ('auditors')
A        2012            15                      3              8                      2                      23     
B        2010             9                      6              8                      2                      11     
C        2010             1                      8              8                      2                      4