たくさんのファイルがあります。いくつかはUnixの行末であり、多くはDOSです。行末を切り替える前に、各ファイルをテストして、がdos形式であるかどうかを確認したいと思います。
どうすればいいですか?テストできるフラグはありますか?似たような?
たくさんのファイルがあります。いくつかはUnixの行末であり、多くはDOSです。行末を切り替える前に、各ファイルをテストして、がdos形式であるかどうかを確認したいと思います。
どうすればいいですか?テストできるフラグはありますか?似たような?
「ユニバーサル改行モード」()のおかげで、Pythonはファイルで使用されている改行規則を自動的に検出でき、ファイルオブジェクトU
の属性からPythonの推測にアクセスできます。newlines
f = open('myfile.txt', 'U')
f.readline() # Reads a line
# The following now contains the newline ending of the first line:
# It can be "\r\n" (Windows), "\n" (Unix), "\r" (Mac OS pre-OS X).
# If no newline is found, it contains None.
print repr(f.newlines)
これにより、最初の行(Unix、DOSなど)の改行が終了します(存在する場合)。
John M.が指摘したように、万が一、複数の改行コーディングを使用する病理ファイルがある場合f.newlines
は、多くの行を読んだ後、これまでに見つかったすべての改行コーディングのタプルです。
参照:http ://docs.python.org/2/library/functions.html#open
ファイルを変換したいだけの場合は、次のようにするだけです。
with open('myfile.txt', 'U') as infile:
text = infile.read() # Automatic ("Universal read") conversion of newlines to "\n"
with open('myfile.txt', 'w') as outfile:
outfile.write(text) # Writes newlines for the platform running the program
文字列で。を検索できます\r\n
。これがDOSスタイルの行末です。
編集:これを見てください
(Python 2のみ:)DOSまたはUnix形式のテキストファイルを読みたいだけの場合、これは機能します。
print open('myfile.txt', 'U').read()
つまり、Pythonの「ユニバーサル」ファイルリーダーは、すべての異なる行末マーカーを自動的に使用して、それらを「\n」に変換します。
http://docs.python.org/library/functions.html#open
(ハンドルありがとう!)
完全なPython初心者として、そして楽しみのために、私は1つのファイルについてこれをチェックするいくつかの最小限の方法を見つけようとしました。これはうまくいくようです:
if "\r\n" in open("/path/file.txt","rb").read():
print "DOS line endings found"
編集:John Machinのコメントに従って簡略化されています(正規表現を使用する必要はありません)。
dosの改行は\r\n
、UNIXのみ\n
です。したがって、を検索するだけです\r\n
。
grepとbashの使用:
grep -c -m 1 $'\r$' file
echo $'\r\n\r\n' | grep -c $'\r$' # test
echo $'\r\n\r\n' | grep -c -m 1 $'\r$'
次の関数(Python2およびPython3で機能するはずです)を使用して、既存のテキストファイルで使用されている改行表現を取得できます。考えられる3種類すべてが認識されます。この関数は、決定する最初の改行までのみファイルを読み取ります。これは、テキストファイルが大きい場合に高速でメモリ消費量が少なくなりますが、改行の混合末尾は検出されません。
Python 3では、ファイルを書き込むときに、この関数の出力を関数のnewline
パラメーターに渡すことができます。open
このようにして、改行表現を変更せずにテキストファイルのコンテキストを変更できます。
def get_newline(filename):
with open(filename, "rb") as f:
while True:
c = f.read(1)
if not c or c == b'\n':
break
if c == b'\r':
if f.read(1) == b'\n':
return '\r\n'
return '\r'
return '\n'