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が表示されます。どうして?
\n
は、テキストモードで開かれたファイルの場合はos.linesep
に変換されます。したがって、Windowsでテキストモードファイルにos.linesep
を書き込むと、\r\n
を書き込むと、\n
が変換されて\r\r\n
になります。
参照 ドキュメント :
テキストモード(デフォルト)で開いたファイルを書き込むときは、os.linesepを行末記号として使用しないでください。すべてのプラットフォームで、代わりに単一の「\ n」を使用してください。
Python 3
open()
は新しいパラメータnewline
を導入し、\n
の出現が変換される文字列を指定できるようにします。
空の文字列引数newline=''
を渡すと、変換が無効になり、改行文字はそのままになります。テキストモードでのみ有効です。
出力時に、改行がNoneの場合、書き込まれた '\ n'文字は、システムのデフォルトの行区切り文字os.linesepに変換されます。改行が ''の場合、変換は行われません。改行が他の有効な値のいずれかである場合、書き込まれた '\ n'文字はすべて指定された文字列に変換されます。
テキストファイルの行末はオペレーティングシステムによって異なりますが、行末文字が一貫している文字列を操作すると便利です。 Pythonは、ユニバーサル行末文字として'\n'
を使用し、必要に応じてファイルの読み取りおよび書き込み関数に依存して変換を行うというCの規則を継承しています。読み取りおよび書き込み関数ファイルがデフォルトのtext
モードで開かれた場合、これを行うことを知っています。ファイルを開くときにモード文字列にb
文字を追加すると、この変換はスキップされます。
私のために働く:
>>> 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
あなたはそれが何だと思いますか?
open ()ドキュメントを参照してください:
標準のfopen()値に加えて、モードは「U」または「rU」の場合があります。 Pythonは通常、ユニバーサル改行サポートを使用して構築されます。「U」を指定すると、ファイルがテキストファイルとして開きますが、行は次のいずれかで終了できます。Unixの行末規則 '\n '、Macintoshの規則'\r '、またはWindowsの規則'\r\n '。これらの外部表現はすべて、Pythonプログラムによって'\n 'として認識されます。 Pythonは、ユニバーサル改行サポートなしでビルドされます。「U」のモードは通常のテキストモードと同じです。そのように開かれたファイルオブジェクトにも、値がNoneのnewlinesという属性があることに注意してください(if改行はまだ表示されていません)、 '\ n'、 '\ r'、 '\ r\n'、または表示されているすべての改行タイプを含むタプル。