1

次のような出力を取得しようとしています:

KPLR003222854-2009131105131

テキストファイルで。私がその出力を導出しようとしている方法は次のとおりです。

with open('Processed_Data.txt', 'r') as file_P, open('KIC_list.txt', 'w') as namelist:
    nameData = []           
    for line in file_P:
        splt_file_P = line.split()
        nameData.append(splt_file_P[0])
    for key in nameData:
        namelist.write('\n' 'KPLR00' + "".join(str(w) for w in nameData) + '-2009131105131')

ただし、上記のように on ID をきれいに使用するのではなく、nameData 配列の数値がすべて指定された出力に一度に表示されるという問題があります。出力は次のようになります。

KPLR00322285472138721382172198371823798123781923781237819237894676472634973256279234987-2009131105131

したがって、私の質問は、個別の ID (それぞれに特定のインデックス値がありますが、150 以上あります) を適切に出力できるように、書き込みコマンドをループする方法です。

編集: また、リスト内の ID の一部は同じ長さではないため、「キー」の前に 0 を追加して、すべて 9 桁に等しくしたいと考えました。KPLR に 0 を引用符で囲んで追加することでこれをごまかしましたが、すべての ID に 2 つの 0 が必要なわけではありません。問題は、KPLR とキーの間に何らかの方法で 0 を追加して、9 桁の形式に一致させることはできますか?

4

3 に答える 3

1

あなたのコードは、期待どおりに動作しているように見えます:"".join(str(w) for w in nameData)内のすべてのアイテムの連結で構成される文字列を作成しますnameData

あなたが望む可能性があります。

for key in nameData:
    namelist.write('\n' 'KPLR00' + key + '-2009131105131')

またはさらに良い:

for key in nameData:
    namelist.write('\nKPLR%09i-2009131105131'%int(key)) #no string concatenation

文字列の連結は遅くなる傾向があり、文字列のみを操作していない場合は、への明示的な呼び出しが必要になりますstr。違いを示す ideone スニペットのペアを次に示します: http://ideone.com/RR5RnLhttp://ideone.com/VH2gzx

また、フォーマット文字列'%09i'を含む上記のフォームは、最大 9 桁の数字にするために 0 で埋められます。形式が であるため、'%i'への明示的な変換を追加しましたint詳細については、http: //docs.python.org/2/library/stdtypes.html#string-formatting-operationsを参照してください。

最後に、ここに 1 行のバージョンを示します (withステートメントを除いて、もちろん保持する必要があります)。

namelist.write("\n".join("KPLR%09i-2009131105131"%int(line.split()[0]) for line in file_P))
于 2013-07-11T15:58:33.730 に答える
0

これは次のように変更できます。

"".join(str(w) for w in nameData)

これに:

",".join(str(w) for w in nameData)

基本的に、「,」はnameDataリスト内の要素をコンマで区切ります。を使用する""と、要素を区切るものがないため、要素が一度に表示されます。必要に応じて区切り文字を変更できます。

于 2013-07-11T15:57:43.153 に答える
0

キックのために:

with open('Processed_Data.txt', 'r') as file_P, open('KIC_list.txt', 'w') as namelist:
    nameData = [line.split()[0] for line in file_P]
    namelist.write("\n".join("KPLR00" + str(key) + '-2009131105131' for key in nameData))

うまくいくと思いますが、テストしていません。nameData をまったく使用しないことで、さらに小さく/醜くすることができ、その場所でそのリスト内包表記を使用するだけです。

于 2013-07-11T16:07:25.647 に答える