22

Pythonを使用して一連のSQLステートメントをファイルに書き込んでいます。テンプレート文字列は次のようになります。

store_insert = '\tinsert stores (storenum, ...) values (\'%s\', ...)'

私は次のようにファイルに書き込んでいます:

for line in source:
    line = line.rstrip()
    fields = line.split('\t')
    script.write(store_insert % tuple(fields))
    script.write(os.linesep)

ただし、結果の出力では、予想どおり\ r \ nではなく、各行の最後に\ r \ r\nが表示されます。なんで?

4

5 に答える 5

43

\nos.linesepテキストモードで開いたファイル用に変換されます。したがって、os.linesepWindowsでテキストモードファイルに書き込む場合、を書き込む\r\nと、\nが変換されて。になり\r\r\nます。

ドキュメントも参照してください:

テキストモード(デフォルト)で開いたファイルを書き込むときは、os.linesepを行末記号として使用しないでください。すべてのプラットフォームで、代わりに単一の「\n」を使用してください。

于 2010-10-26T16:57:47.477 に答える
15

Python3を使用

open()出現する文字列が変換されるnewline文字列を指定できる新しいパラメータが導入されました。\n

空の文字列引数を渡すとnewline=''、変換が無効になり、改行文字はそのままになります。テキストモードでのみ有効です。

ドキュメントから

出力時に、改行がNoneの場合、書き込まれた'\ n'文字は、システムのデフォルトの行区切り文字os.linesepに変換されます。改行が''の場合、変換は行われません。改行が他の有効な値のいずれかである場合、書き込まれた'\n'文字はすべて指定された文字列に変換されます。

于 2016-12-20T17:25:09.990 に答える
6

テキストファイルの行末はオペレーティングシステムによって異なりますが、行末文字が一貫している文字列を操作すると便利です。Pythonは'\n'、ユニバーサル行の終了文字として使用し、必要に応じてファイルの読み取りおよび書き込み関数に依存して変換を行うというCの規則を継承しています。読み取りおよび書き込み関数は、ファイルがデフォルトtextモードで開かれた場合にこれを行うことを認識しています。bファイルを開くときにモード文字列に文字を追加すると、この変換はスキップされます。

于 2010-10-26T17:04:09.827 に答える
1

open()ドキュメントを参照してください:

標準のfopen()値に加えて、モードは「U」または「rU」の場合があります。Pythonは通常、ユニバーサル改行サポートを使用して構築されています。'U'を指定すると、ファイルはテキストファイルとして開きますが、行は次のいずれかで終了できます:Unixの行末規則'\ n'、Macintoshの規則'\ r'、またはWindowsの規則'\ r \n'。これらの外部表現はすべて、Pythonプログラムでは「\n」と見なされます。Pythonがユニバーサル改行サポートなしで構築されている場合、「U」のモードは通常のテキストモードと同じです。そのように開かれたファイルオブジェクトには、None(改行がまだ表示されていない場合)、'\ n'、'\ r'、'\ r \ n'、またはすべてを含むタプルの値を持つnewlinesという属性もあることに注意してください。見られる改行タイプ。

于 2010-10-26T16:35:26.283 に答える
1

私のために働く:

>>> import tempfile
>>> tmp = tempfile.TemporaryFile(mode="w+")
>>> store_insert = '\tinsert stores (storenum, ...) values (\'%s\', ...)'
>>> lines = ["foo\t\t"]
>>> for line in lines:
...     line = line.rstrip()
...     fields = line.split("\t")
...     tmp.write(store_insert % tuple(fields))
...     tmp.write(os.linesep)
...
>>> tmp.seek(0)
>>> tmp.read()
"\tinsert stores (storenum, ...) values ('foo', ...)\r\n"

これが実行中のコードであり、os.linesepそれがあなたが考えているものであると確信していますか?

于 2010-10-26T16:45:01.320 に答える