逗号将矩阵与txt文件分开

时间:2015-03-01 20:51:28

标签: python matrix multiple-columns word-frequency

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

我的输入文件如何:

Company ABC-GH Date:31.12.2012
financial statement:4
corporate-taxes:8
assets:2
available-for-sale property:0
auditors:213

123-Company XYZ Date:31.12.2012
financial statement:15
corporate-taxes:3
assets:8
available-for-sale property:2
auditors:23

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

现在我想创建一个包含矩阵的单个文件,它将所有单词保留为顶部列,并将文件特征(文件名,日期和频率)作为行方式附加,以逗号分隔以便进一步处理它们,即如果第三个逗号(第四个条目)之后的术语是“公司税”而不是每一行,则第四个条目应该是该文件中该术语的相关频率。

期望的输出:

Filename,Date,  financial statement,    corporate-taxes, ..  auditors
COMPANY ABC-GH      , 2008 ,           15      ,      3       ,     23
123-COMPANY XYZ      , 2010 ,            9      ,      6       ,     11

最后,我想将结果写入TXT文件。你有什么想法吗?

1 个答案:

答案 0 :(得分:0)

假设您有一个文件列表

lof = ['a1.txt', 'a2.txt', 'b1.txt']

您可以将结果初始化为空列表

res = []

然后在结果中附加为每个输入文件计算的特定列表推导

for f in lof:
    res += [[entry.split(':')[1] for entry in cdata ]
             for cdata in [data.splitlines() for data in open(f).read().split('\n\n')]]

让我们看一下理解的内部部分,对于一个与你的例子具有相同内容的文件,'ex.txt'

In [44]: [d.splitlines() for d in open('ex.txt').read().split('\n\n')]
Out[44]: 
[['Company ABC-GH Date:31.12.2012',
  'financial statement:4',
  'corporate-taxes:8',
  'assets:2',
  'available-for-sale property:0',
  'auditors:213'],
 ['123-Company XYZ Date:31.12.2012',
  'financial statement:15',
  'corporate-taxes:3',
  'assets:8',
  'available-for-sale property:2',
  'auditors:23']]

理解的外部每个cdata是什么?

In [45]: for cdata in [d.splitlines() for d in open('ex.txt').read().split('\n\n')]:
   ....:     print cdata
   ....:     
['Company ABC-GH Date:31.12.2012', 'financial statement:4', 'corporate-taxes:8', 'assets:2', 'available-for-sale property:0', 'auditors:213']
['123-Company XYZ Date:31.12.2012', 'financial statement:15', 'corporate-taxes:3', 'assets:8', 'available-for-sale property:2', 'auditors:23']

对于每个cdata(即公司数据),我们想要一个仅包含:之后的部分的列表,因此我们将分为':'&只保留索引1元素

In [46]: [[entry.split(':')[1]for entry in cdata]]
Out[46]: [['31.12.2012', '15', '3', '8', '2', '23']]

将它们整合在一个列表理解中只是一个问题

In [47]: [[entry.split(':')[1]for entry in comp_data ]for comp_data in [data.splitlines()for data in open('dele.txt').read().split('\n\n')]]
Out[47]: 
[['31.12.2012', '4', '8', '2', '0', '213'],
 ['31.12.2012', '15', '3', '8', '2', '23']]

并将其放入我之前显示的循环中,累积所有输入文件的结果

相关问题