我正在从像这样的文本文件中读取数据
>VAL1;Date1;K123 K135;A lot of text
>VAL2;Date2;K231 K389;more text
>VAL3;Date3;K123;even more text
>VAL4;Date4;K389;even more text
>VAL5;Date5;K634 K123 K888;even more text
期望的输出,而col4是col2的计数,col5是col1的计数
>K123;VAL1;Date1;2;3
>K135;VAL1;Date1;1;2
>K231;VAL2;Date2;1;2
>K398;VAL2;Date2;2;2
>K123;VAL3;Date3;2;3
>K398;VAL4;Date4;2;1
>K634;VAL5;Date5;3;1
>K123;VAL5;Date5;3;3
>K888;VAL5;Date5;3;1
想法是将它读入列表和嵌套列表。
List = [['VAL1','Date1',['K123','K125'],'A lot of text'],['VAL2','Date2',['K231','K389'],'more text'],...]
这是我的代码到目前为止创建列表和嵌套列表但我无法使其达到所需的输出。你能支持吗?
import re
raw_data = open('C:\Users\denis.gerhardt\DMS\INC.txt').read().strip('\n')
val = re.findall('INC.+',raw_data)
meta=[]
for item in val:
meta.append(item.split(';'))
k=[]
for k in meta:
k.append(re.findall(r'\bK[0-9]+',k[2]))
print meta
close(raw_data)
答案 0 :(得分:0)
聪明是好的,但在这种情况下,你应该将问题分解为可理解的位,然后将它们全部重新组合在一起。这不仅会更容易,而且更具可读性和长期可维护性。
例如,您的一列是K值的计数。有很多方法可以做到这一点:
# ['VAL1;Date1;K123 K135;A lot of text', ... ]
val = """VAL1;Date1;K123 K135;A lot of text
VAL2;Date2;K231 K389;more text
VAL3;Date3;K123;even more text
VAL4;Date4;K389;even more text
VAL5;Date5;K634 K123 K888;even more text""".split('\n')
# Most straightforward method:
# Parse the lines then use a dictionary to keep count
count_k_1 = {}
for line in val:
array = line.split(';')
ks = array[2].split(' ')
for k in ks:
try:
count_k_1[k] += 1
except KeyError:
count_k_1[k] = 1
print count_k_1
# Fancy method:
# Use a collection.Counter and then parse in a list comprehension
import collections
count_k_2 = collections.Counter([item for line in val for item in
line.split(';')[2].split(' ')])
print count_k_2
输出:
{'K888': 1, 'K231': 1, 'K123': 3, 'K634': 1, 'K389': 2, 'K135': 1}
Counter({'K123': 3, 'K389': 2, 'K888': 1, 'K231': 1, 'K634': 1, 'K135': 1})
可能还有两件重要的事情要写:
这些留给读者练习。