2017-11-13 4 views
0

関数間で情報やデータを保存したり交換するために、たくさんの一時ファイルを生成する古いスクリプトを書き直しています。ファイルを生成する際のオーバーヘッドを避けるために、それらを変数として保持したい。Python 2.7の文字列の 'join'とファイルの 'read binary'の比較

私の問題:私は2つのファイルがこのコードを使用してバイナリレベルでマージされている機能に遭遇しました:

with open(first_file, "ab") as file1, open(second_file, "rb") as file2: 
     file1.write(file2.read()) 

私は文字列を使用して、同じことをしたいと思っと」.join'関数のようにこれは:

first_file = ''.join([first_file, second_file]) 

私の質問:「読み込みバイナリ」と同じですか?あるいは、 'バイナリ読み出し'モードは.joinにも適用されますか?

私が作業しているデータはバイナリなので、単純な '読み取り'コマンドは内容を変更する可能性があります。

は、これまでのところ私は、公式Pythonドキュメントでこの情報を見つけました:Windows上

Pythonは、テキストとバイナリファイルを区別します。 テキストファイルの行末の文字は、データの読み書き時に自動的に変更されます( )。この背後にあるシーン は、ASCIIテキストファイルでは問題ありませんが、 ではJPEGやEXEファイルのようなバイナリデータが破損しています。小規模なテストを作る

+0

コードを試してみて、どちらの場合でも結果が同じかどうかを確認してみませんか? – GPhilo

+0

私はまだ完全なリワークを完了していないので、この機能を動作させるには多くの回避策が必要です。また、私はいくつかの理論上の背景を望んで、機能をうまく解消することを望んだ。これまでのところ私はインターネット上の私の質問に関しては何の情報も見つけていない。 – redscale

+0

スタブが必要なのは、2つのファイル "a.txt"と "b.txt"を作成し、両方に何かを書き、ファイルに投稿した行を実行して結果が一致するかどうかを確認してください – GPhilo

答えて

0

a.txt'Hello'が含まれているが、 'B.TXTは' 'World'が含まれています。

with open('a.txt', "ab") as file1, open('b.txt', "rb") as file2: 
    file1.write(file2.read()) 

a.txt'HelloWorld'が含まれています。 「こんにちは」に戻すa.txtを変更した後、他のスニペットで確認

with open('a.txt', "rb") as file1, open('b.txt', "rb") as file2: 
    first_file = file1.read() 
    second_file = file2.read() 

first_file = b''.join([first_file, second_file]) 
with open('a.txt', 'wb') as fp: 
    fp.write(first_file) 

a.txtの含有量が再び'HelloWorld'あるので、2つの方法は、(少なくとも結果に関して)同等です。明らかに、最初の方法はよりコンパクトです。

+0

まあ、 'first_file + = second_file'はよりコンパクトです。 –

+0

公式のPythonのドキュメントから:" WindowsのPythonはテキストファイルとバイナリファイルを区別し、テキストファイルの行末の文字は自動的にわずかに変更されますファイルのデータに対する舞台裏の変更は、ASCIIテキストファイルでは問題ありませんが、JPEGやEXEファイルのようなバイナリデータは壊れてしまいます。だからこそ私が求めているのは、「私の」ファイルのデータはバイナリであり、テキストではないということです。 – redscale

+0

実際に@SergeBallestaですが、OPの質問はこれらの2つの方法の間で具体的でした。 – GPhilo

0

読むバイナリは、生の文字列を示すために、R「somestring」を使用してに多少似ている - はバイナリで基礎となるファイル、あなただけのASCIIまたはUTF-にバイナリデータをデコードしようとしているをスキップへのPythonを言っています8またはwhat-have-youの文字。

したがって、このモードは実際には適用されません。

文字列上で動作し、あなたが開いたファイルにを必要があると思い参加しているので、は、元のコードがちょうどBを読んでまでシークする必要があり、一方、その後は、Bのための同じを、文字列としてにそれを読んでファイルAの終わりに書き込みを開始する。だから、あなたは実際にstr.joinを実行することから多くの走行距離を得ていないし、実際にはより多くのメモリを使用しています。メモリ。

最適化したい場合は、B行を1行ずつ読み込むループを作成します。これにより、一度にBファイル全体をダンプするのではなく、一度に1行分のメモリを読み込むことができます。

+0

これは、Python docsからの引用があなたに警告するエラーで正確に実行されます。バイナリファイルを文字列(**すなわち 'open( 'a.txt'、 'r')' **)として読み込むと、改行**が壊れてしまいます。 'rb'を使うと、バイナリファイルを持つ' fp.read() 'の結果が' bytestring'(Python 2.7では普通の文字列)なので、これを防ぐことができます。 – GPhilo

+0

また、 'r'somestring'' **はしません**は、根底にあるものが「バイナリ」であることを示します。 '' \ n ''は新しい行になり、 '' len( '\ n')== 1 ''を持つが、 'r '\ n''は文字通り2つの別個の文字と 'len(r '\ n')== 2') – GPhilo

+0

Re 1:もちろん、改行も文字です。ファイルを繰り返し処理するには改行は必要ありません。一度に1バイトずつ読み書きしたり、任意の他の任意のデータを書き込んだりすることができます。改行は、テキストデータによって提供される便利な規則です。 – jkm