2017-04-23 31 views
2

私は機械学習のための新しいツールです。私は文字のintを使用しようとするときにいくつかの問題があります。私はMac OS上でPython 3.5を使用します。これは私のコードです:文字列(文字)をファイルテキストから整数に変換する

def file2matrix(filename): 

    fr = open(filename) 
    numberOfLines = len(fr.readlines()) 
    returnMat = zeros((numberOfLines, 3)) 
    classLabelVector = [] 
    fr = open(filename) 
    index=0 
    for line in fr.readlines(): 
     line = line.strip() 
     listFromLine1 = line.split('\t') 
     listFromLine = zeros(3) 
     i = 0 
     for value in listFromLine1: 
      if value.isdigit(): 
       valueAsInt = int(value) 
       listFromLine[i] = valueAsInt 
       i += 1 
     returnMat[index, :] = listFromLine[0:3] 
     classLabelVector.append(int(listFromLine1[-1])) 
     index += 1 
    return returnMat, classLabelVector 

これは私のtxtファイルです:

23 8 1 f 
7 8 5 j 
5 9 1 j 
6 6 6 f 

これはエラーです:

classLabelVector.append(int(listFromLine1[-1])) ValueError: invalid literal for int() with base 10: 'f' 

誰もがこれらの問題に私を助けることができますか?

+0

あなたがこれを作っていますおそらくTextEditのファイルですか? '\\ rtf1'はリッチテキストファイルのようなリッチテキストヘッダのように見えます(これはプレーンテキストと同じではありません)。 –

+0

ええ、私はそれをTextEditでやったけど、すでに.txtに変換しています。私のファイルをどこに作成すればいいのか教えていただけますか? – Cassie

+0

プレーンテキストに作成した場合、エラーは投稿したものとは異なるはずです。それは...ですか?まだ '\\ rtf1'が表示されているのであれば、まだ純粋な平文になっていないでしょう。 –

答えて

0

希望の結果が正しく理解されていれば、n個のリストを含むリストを返すことができます。各リストは、[23。 8. 1.]。次に、[1、5、1、6]のように各リストの最後の番号を取る2番目のリストが必要です。

これがすべて正しいと仮定すると、classLabelVector.append(int(listFromLine1[-1])) ValueError: invalid literal for int() with base 10: 'f'が返されるのは、数字を返すのではなく文字列を返すためです。エラーを修正する3つの問題が見つかりました。

まず、テキスト文書に '\ t'が見つかりませんでした。代わりにlistFromLine1 = line.split(' ')を使用し、スペースに基づいて分割しました。これは単にあなたが投稿したときにコピーされた方法からのものであってもかまいません。

第2に、listFromLineの各位置に値を割り当てると、それを無視して何もしなかったlistFromLine1から追加するので、文字列のままです。

第3に、if value.isdigit():の代わりにif value.isnumeric():を使用してください。

これらのいくつかの問題を修正すると、プログラムが機能するはずです。また、ファイルを開き、fr.readlines()を2回実行し、終了するように指示しないでください。あなたは同じ情報のためにプログラムを2回動かします。一度だけ開くように書き換えるようにしてください。完了すると閉じるため、with open() as fr:を使用してください。

EDIT:あなたが第二のリストをしたい場合は、文字もする代わりに、[F、J、J、F]その後、listFromLine1としてそれを維持するとstrを(使用)の代わりにint型の():classLabelVector.append(str(listFromLine1[-1]))

+0

私のlistFromLineはすでにintに変換されているが、文字 'f'と 'j'は変換されていない文字列(数値)しか含んでいないので、int( 'f')を試したときにエラーが出てlistFromLineに含めることができません。しかし、後で整数型の 'f'と 'j'を使いたいので、これらの文字を整数に変換する方法があれば、classLabelVectorの要素としてこれらの文字(数字ではない)を表示する方法があるのだろうかと思います。 – Cassie

関連する問題