1

配列を持つファイル test.txt があります。

array = [3,5,6,7,9,6,4,3,2,1,3,4,5,6,7,8,5,3,3,44,5,6,6,7]

今私がやりたいことは、配列の内容を取得し、配列を使っていくつかの計算を実行することです. しかし問題はopen("test.txt")、コンテンツを文字列として出力するときです。実際、配列は非常に大きく、ループを実行すると効率的ではない可能性があります。分割せずにコンテンツを取得する方法はあります,か? 新しいアイデアはありますか?

4

7 に答える 7

9

代わりにファイルをjsonとして保存し、jsonモジュールで読み込むことをお勧めします。それか、.pyファイルにして、pythonとしてインポートします。Pythonの割り当てのように見える.txtファイルはちょっと変わっています。

于 2012-06-10T00:34:14.773 に答える
5

Pythonのような式をファイルに保存する場合は、式のみを保存し(つまり、なしでarray =)、を使用して解析しast.literal_eval()ます。

ただし、JSONなどの別の形式の使用を検討してください。計算によっては、すべてのデータを一度にメモリにロードする必要がない形式の使用を検討することもできます。

于 2012-06-10T00:38:42.507 に答える
5

テキスト ファイルは Python 構文のようにする必要がありますか? コンマ区切りの値のリストは、データを提供する通常の方法です。

1,2,3,4,5

csvcsv データを効率的に読み取る方法については、多くのドキュメントがあります。csv リーダー データ オブジェクトを設定したら、次のようなデータを格納できます。

data = [ map( float, row) for row in csvreader]
于 2012-06-10T05:25:16.763 に答える
2

配列を文字列として保存する必要がありますか? pickle ファイルを使用して Python リストとして保存できますか?

そうでない場合は、遅延評価を試していただけますか? おそらく、必要に応じて配列のセクションのみを処理します。

おそらく、常に実行する必要がある配列全体の計算がある場合は、それらの結果を事前に計算し、リストに加えて、またはリストの代わりに txt ファイルに保存することをお勧めします。

于 2012-06-10T00:59:38.807 に答える
2

numpy.genfromtxt または numpy.loadtxt を使用して、numpy を使用してファイルからデータをロードすることもできます。どちらも非常に高速で、ロード時にリキャストを実行できます。ただし、配列が既に読み込まれている場合は、numpy を使用して float の配列に変換できます。これは非常に高速です。

import numpy as np
a = np.array(["1", "2", "3", "4"])
a = a.astype(np.float)
于 2012-06-10T02:24:43.307 に答える
1

OK、次の方法は危険です。コードを挿入してシステムを攻撃するために使用されるため、自己責任で使用してください。
array = eval(open("test.txt", 'r').read().strip('array = '))
execfile('test.txt') # this is the fastest but most dangerous.

より安全な方法。

import ast
array = ast.literal_eval(open("test.txt", 'r').read().strip('array = ')).
  ...
array = [float(value) for value in open('test.txt', 'r').read().strip('array = [').strip('\n]').split(',')]

Python オブジェクトをシリアライズして後でロードできるようにする最も簡単な方法は、pickle を使用することです。人間が読める形式が必要ないと仮定すると、これにより主要な頭が追加されます。どちらにしても、csv は高速で、json は柔軟です。

import pickle
import random
array = random.sample(range(10**3), 20)
pickle.dump(array, open('test.obj', 'wb'))

loaded_array = pickle.load(open('test.obj', 'rb'))
assert array == loaded_array

pickle にはある程度のオーバーヘッドがあり、大きなオブジェクトをシリアル化する必要がある場合は、圧縮率を指定できます。デフォルトは 0 圧縮なしです。pickle.HIGHEST_PROTOCOL に設定できます。pickle.dump(array, open('test.obj', 'wb'), pickle.HIGHEST_PROTOCOL)

大規模な数値データセットまたは科学データセットを使用している場合は、numpy.tofile/numpy.fromfile または scipy.io.savemat/scipy.io.loadmat を使用します。オーバーヘッドはほとんどありませんが、これも numpy/scipy を既に使用している場合に限られます。

幸運を。

于 2012-06-10T06:38:58.390 に答える
1

パーサーを書くことができます。彼らは非常に簡単です。正規表現よりはるかに高速なので、そうしないでください。誰かが提案したわけではありません。

# open up the file (r = read-only, b = binary)
stream = open("file_full_of_numbers.txt", "rb")
prefix = '' # end of the last chunk
full_number_list = []

# get a chunk of the file at a time
while True:
    # just a small 1k chunk
    buffer = stream.read(1024)
    # no more data is left in the file
    if '' == buffer:
        break
    # delemit this chunk of data by a comma
    split_result = buffer.split(",")
    # append the end of the last chunk to the first number
    split_result[0] = prefix + split_result[0]
    # save the end of the buffer (a partial number perhaps) for the next loop
    prefix = split_result[-1]
    # only work with full results, so skip the last one 
    numbers = split_result[0:-1]
    # do something with the numbers we got (like save it into a full list)
    full_number_list += numbers

# now full_number_list contains all the numbers in text format

また、バッファーが空白のときにプレフィックスを使用するには、いくつかのロジックを追加する必要があります。しかし、そのコードはあなたに任せます。

于 2012-06-10T01:12:28.387 に答える