8

ヘッダーを見てディレクトリ内のファイルタイプを出力するプログラムを書いています。

一部のファイルは圧縮されているため、開始点としてそれらを解凍できる必要があります

これまでのところ、ディレクトリを検索し、ヘッダーを使用して拡張子を変更し、圧縮ファイルを開いてその内容を変数に保存することができましたが、変数を新しいファイルとして保存するのに問題があります。

def unzip():
    os.chdir("C:/Users/David/Myfiles")
    files = os.listdir(".")
    for x in (files):
        f = open((x), "rb")
        byte1 = f.read(1)
        byte2 = f.read(1)
        if byte1 == b'\x1f' and byte2 == b'\x8b':
            os.rename((x), (x) + ".gz")
            file = gzip.open((x), "rb")
            content = file.read()   
            print (content)

の行に沿って a コマンドを使用する必要があると思いますが、わかりf.write("newfile", content)ません。

前もって感謝します

4

3 に答える 3

12

一般に、変数に文字列がある場合foo、次のようにファイルに書き込むことができます。

with open('output.file','w') as f:
    f.write(foo)

あなたの場合、入力ファイルハンドルにf既に使用fしているため、使用しません。

次のようなものが必要だと思います:

def unzip():
    os.chdir("C:/Users/Luke/Desktop/Cache")
    files = os.listdir(".")
    for x in (files):
        ifh = open((x), "rb")
        byte1 = ifh.read(1)
        byte2 = ifh.read(1)
        if byte1 == b'\x1f' and byte2 == b'\x8b':
            os.rename((x), (x) + ".gz")
            file = gzip.open((x), "rb")
            contents = file.read()   
            with open('output.file','w') as ofh:
                ofh.write(contents)
于 2012-11-28T20:27:48.137 に答える
1

gzファイルを識別するために最初の2バイトを調べる必要はありません。代わりに、より「Pythonic」なアプローチは、最初に試して、後で謝罪することだと思います(より一般的には「許可よりも許しを求めるのが簡単」として知られています):

import os
import bz2
import gzip

def write(filename, content):
    with open(filename, 'w') as g:
        g.write(content)

def uncompress(dirpath):
    for filename in os.listdir(dirpath):
        filename = os.path.join(dirpath, filename)
        for opener in (gzip.open, bz2.BZ2File):
            try:
                with opener(filename) as f:
                    newfile, ext = os.path.splitext(filename)
                    content = f.read()
                os.unlink(filename)
                write(newfile, content)
            except IOError:
                continue
            else: # break if try worked without IOError        
                break

dirpath = "C:/Users/Luke/Desktop/Cache"
uncompress(dirpath)

os.chdirまた、関数を終了した後でも現在のディレクトリが変更されるため、可能であれば使用を避けることをお勧めしuncompressます。スクリプトが他のディレクトリを処理する場合は、プログラムのすべての段階で現在のディレクトリを注意深く制御する必要があります。代わりに使用する場合os.path.joinは、現在のディレクトリが何であるかを心配する必要はありません。

于 2012-11-28T20:36:08.183 に答える
1

次のようにする必要があります。

with open('filename.whatever', 'wb') as output:
    output.write(your_data)

http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-filesでドキュメントをチェックしてください

于 2012-11-28T20:29:24.680 に答える