2017-03-28 6 views
-1

他の人が生成したテキストファイルを処理しています。これらのファイルには0xA文字で区切られた行がありますが、ときどき行に0xDがスローされます。ここで私は、ファイルを読み込む方法は次のとおりです。迷惑行文字を含むファイルの行単位の読み取り

for i, line in enumerate(open(file_path, "r", newline=chr(10))): 
    ... 

それも、それらの私が行区切りとして0xAがを使用するopenを伝え、それはまだそれが不完全な行を解析させ、浮遊0xDsによって混乱し、表示されます。私は何が欠けていますか?

(処理は、Windows上で起こっている)

+0

古い「普遍的な改行」サポートを取得しようとしていますか、またはLFをオンライン改行にしますか?解析が「不完全」であることをどのようにテストしていますか? – pvg

+0

^Mが混在しているレコードの場合、 'line'は'^M'で停止し、forループを通して次の反復が '^ M'の直後に始まります。 –

+2

コードを投稿できますか?いくつかのサンプルデータ? 「私が見ることができる」は他の誰かが試すことができないものです。 – pvg

答えて

0

は手動で分割線を行うことができますか?

for i, line in enumerate(open(file_path, "r").read().split('\n')): 
    ... 
+0

私は回避策を求めていません。なぜ私のコードが動作していないのか理解したい。 –

+1

その場合、ファイルが別のプラットフォーム(Windowsではなく)で作成されていて、何らかの理由で普遍的な改行をサポートしていないPythonが構築されている可能性があります(https://docs.python.org/3.6/glossaryを参照) .html#term-universal-newlines) –

1

ここは期待通りに動作しているようです(Pythonの3.5):

>>> f = open('test.txt', 'wb') # write in binary mode so nothing is changed 
>>> f.write('both\r\nnewline\ncarriagereturn\rbothagain\r\n'.encode('utf-8')) 
40  
>>> f.close() 

>>> open('test.txt', 'rb').read() # confirm data is intact 
>>> b'both\r\nnewline\ncarriagereturn\rbothagain\r\n' 

>>> list(open('test.txt', 'r', newline=None)) # universal mode (convert everything to '\n') 
['both\n', 'newline\n', 'carriagereturn\n', 'bothagain\n'] 

>>> list(open('test.txt', 'r', newline='')) # universal mode but leave data unchanged 
['both\r\n', 'newline\n', 'carriagereturn\r', 'bothagain\r\n'] 

>>> list(open('test.txt', 'r', newline='\n')) # split only on '\n' 
['both\r\n', 'newline\n', 'carriagereturn\rbothagain\r\n'] 

>>> list(open('test.txt', 'r', newline='\r')) # split only on '\r' 
['both\r', '\nnewline\ncarriagereturn\r', 'bothagain\r', '\n'] 

>>> list(open('test.txt', 'r', newline='\r\n')) # split only on '\r\n' 
['both\r\n', 'newline\ncarriagereturn\rbothagain\r\n'] 

あなたは検証のためのいくつかのサンプルデータ&コードをポストてもらえますか?

関連する問題