1

ゼロから構築しているテスト用の一連のファイルを書き込もうとしています。データペイロードビルダーの出力は文字列型であり、文字列をファイルに直接書き込むのに苦労しています。

ペイロードビルダーは16進値のみを使用し、反復ごとに1バイトを追加するだけです。

私が試した「書き込み」関数はすべて、文字列の書き込みに失敗するか、文字列自体ではなく、文字列のASCIIコードを記述します...

データペイロードと同じファイル名の一連のファイルを作成したい(たとえば、ファイルff.txtにバイト0xffが含まれている)

def doMakeData(counter):
    dataPayload = "%X" %counter
    if len(dataPayload)%2==1:
        dataPayload = str('0') + str(dataPayload)
    fileName = path+str(dataPayload)+".txt"
    return dataPayload, fileName

def doFilenameMaker(counter):
    counter += 1
    return counter

def saveFile(dataPayload, fileName):
    # with open(fileName, "w") as text_file:
          # text_file.write("%s"%dataPayload)  #this just writes the ASCII for the string
    f = file(fileName, 'wb')
    dataPayload.write(f) #this also writes the ASCII for the string
    f.close()
    return

if __name__ == "__main__":
    path = "C:\Users\me\Desktop\output\\"
    counter = 0
    iterator = 100
    while counter < iterator:
        counter = doFilenameMaker(counter)
        dataPayload, fileName = doMakeData(counter)
        print type(dataPayload)
        saveFile(dataPayload, fileName)
4

2 に答える 2

4

バイトだけを書き込むには、を使用chr(n)して整数を含むバイトを取得しますn

コードは次のように簡略化できます。

import os
path = r'C:\Users\me\Desktop\output'
for counter in xrange(100):
    with open(os.path.join(path,'{:02x}.txt'.format(counter)),'wb') as f:
        f.write(chr(counter))

パスに生の文字列を使用していることに注意してください。文字列に「\r」または「\n」が含まれている場合、生の文字列を使用せずにキャリッジリターンまたはラインフィードとして扱われます。

f.writeファイルに書き込む方法です。 chr(counter)バイトを生成します。必ずバイナリモードで記述してください'wb'

于 2012-08-19T05:31:01.540 に答える
1
dataPayload.write(f) # this fails "AttributeError: 'str' object has no attribute 'write'

もちろんそうです。文字列には書き込みません。ファイルに書き込む:

f.write(dataPayload)

つまり、これはwrite()ファイルオブジェクトのメソッドであり、文字列オブジェクトのメソッドではありません。

あなたはそのすぐ上のコメントアウトされたコードでこれを正しく理解しました。なぜここで切り替えたのかわからない...

于 2012-08-19T05:10:34.980 に答える