0

一連のファイルの名前と拡張子を変更する必要があります。現在、名前は「tmax。##。txt」ですが、「tmax_##。txt」にする必要があります。次に、.txt拡張子を.ascに変更します。以下のコードを試しましたが、最初のループは期待どおりに機能し、「tmax_01」を生成します。2番目のループは実行されますが、予期しない結果't'が生成されます。

list_raw = 'tmax.01.txt', 'tmax.02.txt', 'tmax.03.txt'

for i in list_raw:
    list_conv = i.replace('.','_')

for i in list_conv:
list_final = i.replace('_txt','.asc')

助言がありますか?

4

4 に答える 4

3

ループの各反復で変数に新しい値を代入しているだけです。やりたいことは、既存のリストの変更された要素から新しいリストを作成することです。これは、リスト内包表記で行うのが最適です。

list_raw = ['tmax.01.txt', 'tmax.02.txt', 'tmax.03.txt']
list_final = [i.replace(".", "_").replace("_txt", ".asc") for i in list_raw]

私の例のように、これを 1 つのステップで実行できることに注意してください。リストを 2 回反復して中間リストを生成する理由はありませんが、これは非効率的です。

またi.replace(".", "_", 1)、最初の.. ただし、私は個人的に使用i[:-4].replace(".", "_") + ".asc"します。つまり、既存の拡張子をスライスで切り取り、s を置き換えてから.、新しい拡張子を追加します。

拡張機能の長さが異なる可能性がある場合は、sotapmeos.pathで提案されているように、モジュールを調べることをお勧めします。

于 2013-02-02T19:36:20.500 に答える
2

os.pathファイルについて話しているので、コードの次の部分でこれらのファイルまたは他のファイルを操作する可能性が高いため、使用する価値があるかもしれません。(ただの推測)

os.path.splitext('afile.txt')[0] + '.asc'

与える

'afile.asc'
于 2013-02-02T19:40:09.627 に答える
1

最初のループで: -

for i in list_raw:
    list_conv = i.replace('.','_')

オブジェクトlist_convが含まれていstrます。そして、リストの最後の要素と適切な置換が含まれます。

次に、2番目のループで: -

for i in list_conv:
    list_final = i.replace('_txt','.asc')

文字列シーケンスを反復しているだけで、一度に1文字になります。そしてlist_final、適切な置換が行われた最後の文字が含まれます。

の最後の文字tmax_03_txttであるため、 を取得したのはそのためですt


リストの各要素で置換を行いたい場合はlist comprehension、メソッド呼び出しの および chaning を使用できます。

>>> list_raw = ['tmax.01.txt', 'tmax.02.txt', 'tmax.03.txt']
>>> [elem.replace('.', '_').replace('_txt', '.asc') for elem in list_raw]
16: ['tmax_01.asc', 'tmax_02.asc', 'tmax_03.asc']
于 2013-02-02T19:41:03.357 に答える
0

代わりに、文字列メソッド rsplitを使用できます。

list_raw = ['tmax.01.txt', 'tmax.02.txt', 'tmax.03.txt']
list_final = [filename.rsplit('.',1)[0] + '.ext' for filename in list_raw]

ext は新しい拡張子です。rsplit() の 1 は、右端の '.' のみを示します。スプリットポイントとして機能します。

于 2013-02-02T22:37:14.710 に答える