web-dev-qa-db-ja.com

TypeError:Unicodeへの強制:文字列またはバッファが必要

このコードは、次のエラーメッセージを返します。

  • in_fとしてopen(infile、mode = 'r'、buffering = -1)、out_fとしてopen(outfile、mode = 'w'、buffering = -1):TypeError:Unicodeへの強制:文字列またはバッファが必要、ファイルが見つかりました

    # Opens each file to read/modify
    infile=open('110331_HS1A_1_rtTA.result','r')
    outfile=open('2.txt','w')
    
    import re
    
    with open (infile, mode='r', buffering=-1) as in_f, open (outfile, mode='w', buffering=-1) as out_f:
        f = (i for i in in_f if i.rstrip())
        for line in f:
            _, k = line.split('\t',1)
            x = re.findall(r'^1..100\t([+-])chr(\d+):(\d+)\.\.(\d+).+$',k)
            if not x:
                continue
            out_f.write(' '.join(x[0]) + '\n')
    

誰か助けてください。

56
madkitty

各ファイルを2回開こうとしています!最初に:

infile=open('110331_HS1A_1_rtTA.result','r')

次に、infile(ファイルオブジェクト)をopen関数に再度渡します。

with open (infile, mode='r', buffering=-1)

openはもちろん、最初の引数が開かれたファイルではなくファイル名であることを期待しています!

ファイルを一度だけ開くと、問題ないはずです。

65
Gareth Rees

それほど具体的ではない場合(質問のコードだけでなく、これはこの一般的なエラーメッセージのGoogleでの最初の結果の1つです。このエラーは、引数なしで特定のosコマンドを実行する場合にも発生します。

例えば:

os.path.exists(arg)  
os.stat(arg)

ArgがNoneの場合、この例外が発生します。

9
Eran

ファイルオブジェクトをファイル名として渡そうとしています。使用してみてください

infile = '110331_HS1A_1_rtTA.result'
outfile = '2.txt'

コードの先頭に。

open()を2倍に使用すると、ファイルを再度開こうとすると問題が発生するだけでなく、実行中にinfileおよびoutfileが閉じられないことも意味します。 'おそらくプログラムが終了すると閉じられます。)

8
JAB

Python 2で見つけた最良の方法は次のとおりです。

def inplace_change(file,old,new):
        fin = open(file, "rt")
        data = fin.read()
        data = data.replace(old, new)
        fin.close()

        fin = open(file, "wt")
        fin.write(data)
        fin.close()

例:

inplace_change('/var/www/html/info.txt','youtub','youtube')
0
George Chalhoub