0

整数と、浮動小数点数や文字などの偽のデータで構成されるTSVファイルがあります。

アイデアは、ファイルの内容を読み取り、どれが悪いか(整数以外のデータを含む)を見つけることです

ファイルが読み取り用に開かれると、readlineメソッドを使用して各行を読み取ることができます。もちろん、readline()メソッドは、構成データ型ではなく、文字列として読み取られた各行を返します。私の理解では、pickleモジュールを何らかの方法で使用して、ダンプおよびロードメソッドを実行するシリアル化されたバージョンとして表すことにより、元のデータ型を確実に保持できます。

問題は、どうすればこれを行うことができるかということです。

readlineはデフォルトで文字列として読み取るため、各行を読み取ってピクルスにすることは役に立ちません。これにより、ピクルス化すると、実際には文字列をシリアル化されたPythonオブジェクト表現にピクルスするだけで、ピクルス解除すると文字列としてのみ返されます。したがって、整数や文字などの行の実際のデータは、関係なく文字列として表されます。

だから私は問題は、どうやって正しい方法で物事をピクルスにするのか、それともデータ型が維持されていることを確認するためにファイルの各行を処理するのかということだと思います。

4

3 に答える 3

1

ピクルスから文字列を取得する場合と同様に、「\ t」を使用して文字列を分割し、次を使用します。

a = "0343523"
a.isdigit()
True

b = "934sjsspam"
b.isdigit()
False

ユニコードにはもう1つの方法があり、数値チェックもユニコードするので、それらを使用してください

データ型を維持します

于 2012-08-12T21:52:03.040 に答える
0

まず、ピクルスの使用について説明しますが、各行を個別にファイルにピクルスにすることはできません。ascii形式では、改行がそのまま使用されるため、ファイルが乱雑になります。データ全体をデータ構造として選択するだけで、全体に関する情報を保持できます...例:

from cPickle import loads, dumps
from types import IntType

line1 = [1, 2, 3]
line2 = [1.0, 'foo', 'bar']
line3 = [4, 5, 6]
pickled = dumps((line1, line2, line3))
# ((lp1\nI1\naI2\naI3\na(lp2\nF1\naS'foo'\np3\naS'bar'\np4\na(lp5\nI4\naI5\naI6\nat.
unpickled = loads(pickled)
# ([1, 2, 3], [1.0, 'foo', 'bar'], [4, 5, 6])

print all(isinstance(i, IntType) for i in line1)
# True
print all(isinstance(i, IntType) for i in line2)
# False

オブジェクトを戻すと、オブジェクトが明確に入力されるようになりました。

さて、ソースファイルの形式を制御できない場合は、タブで区切られた各行をテストするだけです。

line1 = '1\t2\t3'
line2 = '1.0\tfoo\tbar'
line3 = '4\t5\t6'

print all(map(str.isdigit, line1.split('\t')))
# True
print all(map(str.isdigit, line2.split('\t')))
# False
print all(map(str.isdigit, line3.split('\t')))
# True
于 2012-08-12T21:48:48.503 に答える
0

TSVファイルはすでにすべてのタイプ情報を失っています。

ピクルスモジュールを使用してファイルを書き出すと、簡単にピクルスを外すことができますが、破損したファイルを読み取るだけのように見えるため、ここではピクルスは役に立ちません。

最善の方法は、各フィールドをに変換してint、失敗した場合に例外を処理することです。

于 2012-08-12T22:03:14.347 に答える