python 将所有行拆分为列,行中没有空格
python split all lines in columns, no spaces in lines
我见过很多将文本文件的行拆分为列的方法,但我没有找到使用不带空格的行的方法。
我的文本文件如下所示:
CABDCBADBCADBC
CBDACBABCABCDA
BCDABCDABABABC
CBADCBACBADBCA
我想把它分成几列,然后处理每一列。所以我应该得到类似的东西:
a = [C,C,B,C]
b = [A,B,C,B]
c = [B,D,D,A]
[...]
那我想知道每个字母在每一列中出现了多少次
看起来很简单,但是我没有做到,也没有找到类似的东西......你有什么想法吗?
这是一个生成器对象,它将 return 每一列在其上调用下一个方法。它假定所有行的长度都相同。但如果不是这样,您可以将附加内容包装在一个简单的 try 和 except 块中
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()
如果您希望每个字符都在单独的列中,那么解决方案是所有行的长度都相同
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')]
假设所有行的长度都相同并且您使用的是 Python 2 您可以使用 izip
and 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})),
...
]
假设所有行的长度相同:
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})]
我见过很多将文本文件的行拆分为列的方法,但我没有找到使用不带空格的行的方法。
我的文本文件如下所示:
CABDCBADBCADBC
CBDACBABCABCDA
BCDABCDABABABC
CBADCBACBADBCA
我想把它分成几列,然后处理每一列。所以我应该得到类似的东西:
a = [C,C,B,C]
b = [A,B,C,B]
c = [B,D,D,A]
[...]
那我想知道每个字母在每一列中出现了多少次
看起来很简单,但是我没有做到,也没有找到类似的东西......你有什么想法吗?
这是一个生成器对象,它将 return 每一列在其上调用下一个方法。它假定所有行的长度都相同。但如果不是这样,您可以将附加内容包装在一个简单的 try 和 except 块中
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()
如果您希望每个字符都在单独的列中,那么解决方案是所有行的长度都相同
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')]
假设所有行的长度都相同并且您使用的是 Python 2 您可以使用 izip
and 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})),
...
]
假设所有行的长度相同:
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})]