14

たくさんのファイルがあります。いくつかはUnixの行末であり、多くはDOSです。行末を切り替える前に、各ファイルをテストして、がdos形式であるかどうかを確認したいと思います。

どうすればいいですか?テストできるフラグはありますか?似たような?

4

7 に答える 7

31

「ユニバーサル改行モード」()のおかげで、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
于 2010-05-10T07:26:06.710 に答える
9

文字列で。を検索できます\r\n。これがDOSスタイルの行末です。

編集:これを見てください

于 2010-05-09T18:23:06.307 に答える
3

(Python 2のみ:)DOSまたはUnix形式のテキストファイルを読みたいだけの場合、これは機能します。

print open('myfile.txt', 'U').read()

つまり、Pythonの「ユニバーサル」ファイルリーダーは、すべての異なる行末マーカーを自動的に使用して、それらを「\n」に変換します。

http://docs.python.org/library/functions.html#open

(ハンドルありがとう!)

于 2010-05-09T20:29:36.360 に答える
2

完全なPython初心者として、そして楽しみのために、私は1つのファイルについてこれをチェックするいくつかの最小限の方法を見つけようとしました。これはうまくいくようです:

if "\r\n" in open("/path/file.txt","rb").read():
    print "DOS line endings found"

編集:John Machinのコメントに従って簡略化されています(正規表現を使用する必要はありません)。

于 2010-05-09T19:04:52.823 に答える
0

dosの改行は\r\n、UNIXのみ\nです。したがって、を検索するだけです\r\n

于 2010-05-09T18:23:51.017 に答える
0

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$'  
于 2010-05-10T13:59:55.380 に答える
0

次の関数(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'
于 2019-04-30T20:45:10.663 に答える