Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中多列的两行输出_Python_File_Format_Bioinformatics - Fatal编程技术网

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)