python中多列的两行输出
我正在处理包含以下信息的输出列表:python中多列的两行输出,python,file,format,bioinformatics,Python,File,Format,Bioinformatics,我正在处理包含以下信息的输出列表: [start position, stop position, chromosome, [('sample name', 'sample value'), ('sample name','sample value')...]] [[59000, 59500, chr1, [('cn_04', '1.362352462'), ('cn_01', '1.802001235')]], [100000, 110000, ch
[start position, stop position, chromosome,
[('sample name', 'sample value'),
('sample name','sample value')...]]
[[59000, 59500, chr1,
[('cn_04', '1.362352462'), ('cn_01', '1.802001235')]],
[100000, 110000, chr1,
[('cn_03', '1.887268908'), ('cn_02', '1.990457407'), ('cn_01', '4.302275763')]],
[63500, 64000, chr1,
[('cn_03', '1.887268908'), ('cn_02', '1.990457407'), ('cn_01', '4.302275763')]]
...]
我想将其写入excel文件,该文件将使用样本名称作为列标题,然后使用列中样本的值对其进行格式化。有些示例没有值,因此这些空格将为空或没有数据表示法。如下所示(抱歉,必须使用>>来表示列分隔):
任何帮助都会很好 您可以创建扩展名为“*.csv”的简单文本文件。用逗号分隔每个字段(列)。(可选)在文本字段中使用引号,尤其是在字段需要包含分隔符(逗号)的情况下。您甚至可以放置excel公式(前面加“=”),excel将正确解析它们 双击任何csv文件将在excel中打开它(除非您的计算机有其他设置) 您也可以使用 包含使用Windows COM组件的更复杂控件(格式、电子表格)的示例
编辑:我刚刚看到了。PDF教程似乎非常详细。从未使用过这种方法。这里有一种方法。我做了一个简化的假设,即可能的观测数量有一个很小的有限限制,所以我只是显式地从1循环到6。您可以轻松地扩展循环的上限,尽管如果超过9,get_obs函数中的逻辑将需要更改。你也可以写一些更复杂的东西,首先扫描所有的数据,得到所有可能的观察名称,但如果没有必要,我不想投入这项工作 如果您使用字典而不是元组列表来保存每一行的观察数据,这可能会有所简化
data = [[59000, 59500, 'chr1',
[('cn_04', '1.362352462'), ('cn_01', '1.802001235')]],
[100000, 110000, 'chr1',
[('cn_03', '1.887268908'), ('cn_02', '1.990457407'), ('cn_01', '4.302275763')]],
[63500, 64000, 'chr1',
[('cn_03', '1.887268908'), ('cn_02', '1.990457407'), ('cn_01', '4.302275763')]]
]
def get_obs( num, obslist ):
keyval = 'cn_0' + str(num)
for obs in obslist:
if obs[0] == keyval:
return obs[1]
return "."
for data_row in data:
output_row = ""
for obs in range(1,7):
output_row += get_obs( obs, data_row[3] ) + '\t'
output_row += str(data_row[0]) + '\t'
output_row += str(data_row[1]) + '\t'
output_row += str(data_row[2])
print output_row
千万不要使用这些类型的嵌套列表/字典,它们不是pythonic,很可能会导致错误 相反,请使用类:
>>> class Gene:
def __init__(self, start, end, chromosome, transcripts):
self.start = start
self.end = end
self.chromosome = chromosome
self.transcripts = transcripts
>>> gene1 = Gene(59000, 59500, 'chr1', [('cn_04', '1.362352462'), ('cn_01', '1.802001235')])
>>> gene2 = Gene(100000, 110000, 'chr1', [('cn_03', '1.887268908'), ('cn_02', '1.990457407'), ('cn_01', '4.302275763')])
>>> genes = [gene1, gene2, ...]
>>> gene1.start
59000
>>> genes[1].start
59000
或者使用numpy的记录数组和矩阵
要读取和写入CSV文件,可以使用numpy的重新排列和函数
>>> from matplotlib.mlab import csv2rec, rec2csv
>>> import numpy as np
>>> d = array([(0, 10, 'chr1', [1, 2]), (20, 30, 'chr2', [1,2])], dtype=[('start', int), ('end', int), ('chromosome', 'S8'), ('transcripts', list)])
# all values in the 'chromosome' column
>>> d['chromosome']
array(['chr1', 'chr2'],
dtype='|S8')
# records in which chromosome == 1
>>> d[d['chromosome'] == 'chr1']
# print first record
>>> d[0]
(0, 10, 'chr1', [1, 2])
# save it to a csv file:
>>> rec2csv(d, 'csvfile.txt', delimiter='\t')
为了将数据发送到Excel,我将使用CSV而不是固定长度的文本格式;这样,如果结果是(比如)在浮点值中需要更多的有效数字,那么输出的格式不会改变。此外,您还可以在Excel中打开CSV文件;您不必导入它们。而
csv.writer
为您处理所有数据类型转换问题
我还想利用一个(明显的)事实,即每个观察结果中的第四项似乎是一组键/值对,dict
函数可以将其转化为字典。假设您知道所有的键是什么,您可以通过将它们放在一个列表中(在下面的代码中称为keys
)来指定希望它们在输出中出现的顺序。然后,创建具有列表理解的有序值列表就很简单了。因此:
>>> import sys
>>> import csv
>>> keys = ['cn_01', 'cn_02', 'cn_03', 'cn_04', 'cn_05', 'cn_06']
>>> data = [[59000, 59500, 'chr1', [('cn_04', '1.362352462'), ('cn_01', '1.802001235')]], [100000, 110000, 'chr1', [('cn_03', '1.887268908'), ('cn_02', '1.990457407'), ('cn_01', '4.302275763')]], [63500, 64000, 'chr1', [('cn_03', '1.887268908'), ('cn_02', '1.990457407'), ('cn_01', '4.302275763')]]]
>>> writer = csv.writer(sys.stdout)
>>> writer.writerow(keys + ['start', 'stop', 'chromosome'])
cn_01,cn_02,cn_03,cn_04,cn_05,cn_06,start,stop,chromosome
>>>>for obs in data:
d = dict(obs[3])
row = [d.get(k, None) for k in keys] + obs[0:3]
writer.writerow(row)
1.802001235,,,1.362352462,,,59000,59500,chr1
4.302275763,1.990457407,1.887268908,,,,100000,110000,chr1
4.302275763,1.990457407,1.887268908,,,,63500,64000,chr1
上面的命令将数据写入系统标准输出;要创建真正的CSV文件,请执行以下操作:
with open('file.csv', 'w') as f:
writer = csv.writer(f)
# now use the writer to write out the data
您也可以使用直接写入.xls文件,无需触摸Excel
以下是一些示例代码,可以帮助您入门(远远不够完美):
调用list2xls,数据作为二维列表,可选列和行名称作为列表。我喜欢这个答案!它看起来很漂亮,正是我所需要的。非常感谢。你最初的评论是胡说八道。嵌套列表如何“不是Pythonic”?如何使用第三方库(如numpy)比使用Python的内置功能更具Python风格?我这么说是因为我知道用户想问什么以及为什么。几年前,我也遇到过同样的情况,我可以告诉你,它使用了错误的方法。在任何情况下,读取和写入CSV文件的标准方法都是使用CSV模块,或者使用numpy的重新排列,后者是CSV模块的扩展。以这种方式使用列表列表不是python式的,而是perlist式的,因为在python中,您有更好的数据结构来处理这些情况,而且您还有对象。
with open('file.csv', 'w') as f:
writer = csv.writer(f)
# now use the writer to write out the data
import xlwt as xl
def list2xls(data, fn=None, col_names=None, row_names=None):
wb = xl.Workbook()
ws = wb.add_sheet('output')
if col_names:
_write_1d_list_horz(ws, 0, 1, col_names)
if row_names:
_write_1d_list_vert(ws, 1, 0, row_names)
_write_matrix(ws, 1, 1, data)
if not fn:
fn = 'test.xls'
wb.save(fn)
def _write_matrix(ws, row_start, col_start, mat):
for irow, row in enumerate(mat):
_write_1d_list_horz(ws, irow + row_start, col_start, row)
def _write_1d_list_horz(ws, row, col, list):
for i, val in enumerate(list):
ws.write(row, i + col, val)
def _write_1d_list_vert(ws, row, col, list):
for i, val in enumerate(list):
ws.write(row + i, col, val)