我已经看到很多方法将文本文件的行分成列,但是我找不到使用没有空格的行的方法。
我的文字文件如下:
CABDCBADBCADBC
CBDACBABCABCDA
BCDABCDABABABC
CBADCBACBADBCA
我想将其拆分为列,然后使用每列。所以我应该得到类似的东西:
a = [C,C,B,C]
b = [A,B,C,B]
c = [B,D,D,A]
[...]
然后我想知道每列中每个字母的次数。
看起来很简单,但我没有成功,也没有找到类似的东西......你有什么想法吗?
答案 0 :(得分:0)
这是一个生成器对象,它将在调用下一个方法时返回每一列。它假定所有线都具有相同的长度。但如果它们不是这样,你可以在一个简单的尝试中包装附加,除了块
def generateCol(f):
lines = f.readlines()
col_count = len(lines[0]) #Assuming all lines are of the same length
for col in xrange(col_count):
curr_col = []
for line in lines:
curr_col.append(line[col])
yield curr_col
用法:
gen = generateCol(open('fileName', 'r'))
print gen.next()
答案 1 :(得分:0)
如果您希望每个字符都在单独的列中,则会给出解决方案,即所有行的长度都相同
st = \
"""CABDCBADBCADBC
CBDACBABCABCDA
BCDABCDABABABC
CBADCBACBADBCA"""
print zip(*st.split("\n"))
结果:
[('C', 'C', 'B', 'C'), ('A', 'B', 'C', 'B'), ('B', 'D', 'D', 'A'), ('D', 'A', 'A', 'D'), ('C', 'C', 'B', 'C'), ('B', 'B', 'C', 'B'), ('A', 'A', 'D', 'A'), ('D', 'B', 'A', 'C'), ('B', 'C', 'B', 'B'), ('C', 'A', 'A', 'A'), ('A', 'B', 'B', 'D'), ('D', 'C', 'A', 'B'), ('B', 'D', 'B', 'C'), ('C', 'A', 'C', 'A')]
答案 2 :(得分:0)
假设所有行都是相同的长度并且您使用的是Python 2,则可以使用izip
和Counter
:
from collections import Counter
from itertools import izip
with open('test.txt') as f:
print [(x, Counter(x)) for x in izip(*(line.strip() for line in f))]
输出(部分):
[
(('C', 'C', 'B', 'C'), Counter({'C': 3, 'B': 1})),
(('A', 'B', 'C', 'B'), Counter({'B': 2, 'A': 1, 'C': 1})),
(('B', 'D', 'D', 'A'), Counter({'D': 2, 'A': 1, 'B': 1})),
...
]
答案 3 :(得分:0)
如果所有行的长度相同:
with open(path_to_file) as f:
lines = [line.strip() for line in f.readlines()] # getting rid of '\n'
columns = [[line[i] for line in lines] for i in range(len(lines[0]))]
print(columns) # columns is a list of lists, each list is a column
>> [['C', 'C', 'B', 'C'], ['A', 'B', 'C', 'B'], ... , ['C', 'A', 'C', 'A']]
现在计算每列中的每个字母只需使用count()
或collections.Counter
:
from collections import Counter
print([Counter(col) for col in columns])
>> [Counter({'C': 3, 'B': 1}), Counter({'B': 2, 'C': 1, 'A': 1}), ...,
Counter({'C': 2, 'A': 2})]