1

以下のようなファイルがあります。

0       0       0 
0.00254 0.00047 0.00089
0.54230 0.87300 0.74500 
0       0       0

このファイルを変更したい。値が 0.05 未満の場合、値は 1 になります。それ以外の場合、値は 0 になります。

Pythonスクリプトが実行された後、ファイルは次のようになります

1       1        1
1       1        1
0       0        0
1       1        1

助けてくれませんか?

4

4 に答える 4

4

わかりました。StackOverflow は初めてなので (ようこそ!)、順を追って説明します。あなたのファイルはtest.txt.

with open("test.txt") as infile, open("new.txt", "w") as outfile:

必要なファイル、入力ファイル、および新しい出力ファイルを開きます。このwithステートメントは、ブロックが終了した後にファイルが閉じられることを保証します。

    for line in infile:

ファイルを 1 行ずつループします。

        values = [float(value) for value in line.split()]

これはもっと複雑です。すべての行には、スペースで区切られた値が含まれています。これらは、 を使用して文字列のリストに分割できますline.split()floatただし、これらはまだ文字列であるため、最初に sに変換する必要があります。これはすべて、リスト内包表記で行われます。その結果、たとえば、2 行目がこの方法で処理された後values、次のリストになります[0.00254, 0.00047, 0.00089]

        results = ["1" if value < 0.05 else "0" for value in values]

という名前の新しいリストを作成していますresults。各要素は の要素に対応しvalues"1"if that value < 0.05、または"0"if it not になります。

        outfile.write("      ".join(results))

「整数文字列」のリストをそれぞれ 7 つのスペースで区切られた文字列に変換します。

        outfile.write("\n")

改行を追加します。終わり。


余分な複雑さが気にならない場合は、2 つのリスト内包表記を 1 つに組み合わせることができます。

        results = ["1" if float(value) < 0.05 else "0" for value in line.split()]
于 2013-03-04T14:47:37.670 に答える
2

ライブラリを使用できる場合は、 numpy をお勧めします:

import numpy as np
myarray = np.genfromtxt("my_path_to_text_file.txt")
my_shape = myarray.shape()
out_array = np.where(my_array < 0.05, 1, 0)
np.savetxt(out_array)

書式設定を引数として savetxt 関数に追加できます。関数のドキュメント文字列は一目瞭然です。

純粋な python で立ち往生している場合:

with open("my_path_to_text_file") as my_file:
    list_of_lines = my_file.readlines()
    list_of_lines = [[int( float(x) < 0.05) for x in line.split()] for line in list_of_lines]

次に、そのリストを必要に応じてファイルに書き込みます。

于 2013-03-04T14:49:53.413 に答える
0

次のコードは、インプレースで置換を実行します。その場合、ファイルは'rb+'モードで開かれます。バイナリモードで開くことは絶対に必要ですb+inは、ファイルの'rb+'書き込みと読み取りが可能であることを意味します。モードも記述できることに注意してください'r+b'

しかし、使用'rb+'は厄介です:

  • を使用して読み取る場合for line in f、ファイルはチャンクによって読み取られ、データの別のチャンクが読み取られてバッファーにロードされるまで、ファイルはバッファーに保持され、実際に次々に読み取られます。これにより、変換の実行が難しくなります。これは、ファイルのポインターの位置をたどってtell()ポインターを移動するseek()必要があり、実際、どのように実行する必要があるかを完全には理解していないためです。

    幸いなことにreplace()、理由はわかりませんがreadline()、行を読み取るときにファイルのポインタが行の終わりよりもディスク上に移動しないという事実があるため、解決策があります(つまり、改行で停止します)。
    これで、ファイルのポインタの位置を簡単に移動して知ることができます

  • 読んだ後に書くためにseek()は、たとえそれが行われるべきであったとしても、実行されるようにする必要がありますseek(0,1)。つまり、実際の位置から0文字の移動を意味します。そのように、ファイルのポインタの状態を変更する必要があります。

さて、あなたの問題のために、コードは次のとおりです:

import re
from os import fsync
from os.path import getsize

reg = re.compile('[\d.]+')

def ripl(m):
    g = m.group()
    return ('1' if float(g)<0.5 else '0').ljust(len(g))

path = ...........'

print 'length of file before : %d' % getsize(path)

with open('Copie de tixti.txt','rb+') as f:
    line = 'go'
    while line:
        line = f.readline()
        lg = len(line)
        f.seek(-lg,1)
        f.write(reg.sub(ripl,line))
        f.flush()
        fsync(f.fileno())

print 'length of file after : %d' % getsize(path)

flush()そして、命令が命令された瞬間に命令が効果的に書き込むfsync()ことを確実にするために実行されなければなりません。f.write(reg.sub(ripl,line))

私はUnicodeのようにエンコードされたファイルを管理したことがないことに注意してください。すべてのUnicode文字が数バイトでエンコードされるため(UTF8の場合、文字に応じて可変バイト数)、それは確かにさらに困難です。

于 2013-03-04T19:37:46.837 に答える
0

このコードを使用できます

f_in=open("file_in.txt", "r")       #opens a file in the reading mode
in_lines=f_in.readlines()           #reads it line by line
out=[]
for line in in_lines:
    list_values=line.split()        #separate elements by the spaces, returning a list with the numbers as strings
    for i in range(len(list_values)):
        list_values[i]=eval(list_values[i])     #converts them to floats
#       print list_values[i],
        if list_values[i]<0.05:     #your condition
#           print ">>", 1
            list_values[i]=1
        else:
#           print ">>", 0
            list_values[i]=0
    out.append(list_values)         #stores the numbers in a list, where each list corresponds to a lines' content
f_in.close()                        #closes the file

f_out=open("file_out.txt", "w")     #opens a new file in the writing mode
for cur_list in out:
    for i in cur_list:
        f_out.write(str(i)+"\t")    #writes each number, plus a tab
    f_out.write("\n")               #writes a newline
f_out.close()                       #closes the file
于 2013-03-04T14:57:08.670 に答える