0

次の情報を含む出力リストを使用しています。

[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ファイルに書きたいと思います。一部のサンプルには値がないため、これらのスペースは空白になるか、データ表記がありません。このように見えるもの (申し訳ありませんが、列の分離を示すために >> を使用する必要がありました):

cn_01     cn_02     cn_03     cn_04     cn_05     cn_06    start    stop    chromosome  

1.802     ""        ""        1.362     ""        ""       59000    59500   chr1  
4.302     1.990     1.887     ""        ""        ""       100000   110000  chr1  

どんな助けでも素晴らしいでしょう。

4

5 に答える 5

3

Excelにデータを送信するには、固定長のテキスト形式ではなくCSVを使用します。そうすれば、フロート値にもっと有効数字が必要であることが判明した場合(たとえば)、出力の形式は変わりません。また、ExcelでCSVファイルを開くこともできます。それらをインポートする必要はありません。そして、csv.writerデータ型変換のすべての問題に対処します。

また、各観測値の4番目の項目がキーと値のペアのセットであるように見えるという(明らかな)事実を利用します。これは、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

上記はデータをsys.stdout;に書き込みます。実際のCSVファイルを作成するには、次のようにします。

with open('file.csv', 'w') as f:
    writer = csv.writer(f)
    # now use the writer to write out the data
于 2009-10-15T19:06:11.630 に答える
0

これが1つのアプローチです。可能な観測数には小さな有限の制限があるという単純化した仮定をしたので、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
于 2009-10-15T17:27:17.913 に答える
0

xlwtを使用して、Excel に触れずに .xls ファイルを直接書き込むこともできます。 詳細情報.

始めるためのサンプルコードを次に示します (完全とは言えません)。

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)

データを 2 次元リストとして、オプションの列名と行名をリストとして、list2xls を呼び出します。

于 2009-10-16T06:31:44.170 に答える
0

「*.csv」拡張子の単純なテキスト ファイルを作成できます。各フィールド (列) をコンマで区切ります。必要に応じて、テキスト フィールドに引用符を使用します。特に、フィールドに区切り文字 (カンマ) が含まれていることが予想される場合はそうです。Excel の数式 (「=」が前に付いている) を入力することもでき、Excel はそれらを正しく解析します。

csv ファイルをダブルクリックすると、Excel でファイルが開きます (コンピューターに他の設定がない場合)。

csv モジュールを使用することもできます

Learning Python bookには、Windows COM コンポーネントを使用したより複雑な制御 (書式設定、スプレッドシート) の例が含まれています。

編集:このサイトを見たばかりです。PDFチュートリアルは非常に詳細なようです。これを使用したことはありません。

于 2009-10-15T17:07:20.323 に答える
-1

これらのタイプのネストされたリスト/辞書は絶対に実行しないでください。これらは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のrecordarraysとmatrixを使用します。

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')
于 2009-10-15T17:27:30.127 に答える