1

ファイルを書き込み、Linux、Windows、およびおそらく osx で実行する必要がある python(2.7) スクリプトを作成しています。残念ながら、互換性の問題のため、Windows スタイルではキャリッジ リターンとライン フィードを使用する必要があります。私が仮定しても大丈夫ですか:

str = someFunc.returnA_longText()
with open('file','w') as f:
    if os.name == 'posix':
        f.write(str.replace('\n','\r\n'))
    elif os.name == 'nt'
        f.write(str)    
    

私は他人に配慮する必要がありますか?os.name には他の選択肢があります ('posix'、'nt'、'os2'、'ce'、'java'、'riscos')。代わりにプラットフォーム モジュールを使用する必要がありますか?

更新 1:

  1. 目標は、任意の OS で '\r\n' を使用することです。

  2. 私はからstrを受け取っています

    str = etree.tostring(root, pretty_print=True, xml_declaration=True, encoding='UTF-8')

私はファイルを読んでいません。
3. 私のせいです。代わりに os.linesep を確認する必要がありますか?

4

1 に答える 1

7

これは、 Python ファイル オブジェクトで処理できます。デフォルトでは、テキスト モード ファイルに書き込むと\n行末がプラットフォーム ローカルに変換されますが、この動作はオーバーライドできます。

関数ドキュメントnewlineのオプションを参照してください。open()

newlineは、ユニバーサル改行モードの動作を制御します (テキスト モードにのみ適用されます)。、、、、、のいずれかNoneです。次のように機能します。'''\n''\r''\r\n'

  • ストリームから入力を読み取るときに、改行がの場合None、ユニバーサル改行モードが有効になります。'\n'入力の行は、'\r'、またはで終わることができ、これらは呼び出し元に返される前に に'\r\n'変換されます。'\n'の場合''、ユニバーサル改行モードが有効になりますが、行末は翻訳されずに発信者に返されます。他の有効な値のいずれかが含まれている場合、入力行は指定された文字列でのみ終了し、行末は翻訳されずに呼び出し元に返されます。
  • ストリームに出力を書き込むときに、改行Noneの場合、'\n'書き込まれた文字はシステムのデフォルトの行区切り文字 に変換されますos.linesep。newline が''またはの場合'\n'、変換は行われません。newlineが他の有効な値のいずれかである場合、書き込ま'\n'れた文字は指定された文字列に変換されます。

(上記は Python 3 に適用されます。Python 2 にも同様の動作io.open()あり、必要に応じて Python 3 I/O オプションが提供されます)。

newlineどの行末が書き込まれるかを強制する必要がある場合は、オプションを設定します。

with open('file', 'w', newline='\r\n') as f:

Python 2 では、バイナリ モードでファイルを開く必要があります。

with open('file', 'wb') as f:
    # write `\r\n` line separators, no translation takes place

またはio.open()、Unicode テキストを使用して記述します。

import io

with io.open('file', 'w', newline='\r\n', encoding='utf8') as f:
     f.write(str.decode('utf8'))

(ただし、適切なエンコーディングを選択してください。Python 3 でも、コーデックを明示的に指定することは常に良い考えです)。

プログラムが現在のプラットフォームに適した行区切りを知る必要がある場合は、os.linesep常に定数を使用できます。

于 2016-12-05T11:01:24.380 に答える