-1

私は現在、クラスのプロジェクトを行っていますが、少しアドバイス/ヘルプが必要です。データを抽出するcsvファイルがあります。(csv モジュールは使い慣れていないため、使用していません。インストラクターは複雑だと警告しました。) 作成した関数を使用して、データをリストに取得しました。値が単なる数字の文字列である場合は正常に機能しますが、セルにパーセント記号または「N/A」がある場合、エラーが発生します。コードは次のとおりです。

def get_values(file, index):

    '''(file object, int) -> list
    Return a list of states and corresponding values at a prticular index in file.'''

    values_list = []
    for i in range(6):
        file.readline()
    for line in file:
        line_list = line.split(',')
        values_list.append(line_list[index])
    values_list = [i.rstrip('%') for i in values_list]
    values_list = [float(i) for i in values_list]
    return values_list




while True:
    try:
        file_name = input('Enter in file name: ')
        input_file = open( file_name, 'r')
        break

    except IOError:
         print('File not found.')




heart_list = get_values(input_file, 1)

input_file.close()
input_file = input_file = open( 'riskfactors.csv', 'r')


HIV_list = get_values(input_file, 8)

input_file.close()

% を削除したいのですが、これまで試したことはありません。助言がありますか?

4

1 に答える 1

1

サンプル入力を含む完全なSSCCEを見ないと、確かなことはわかりませんが、問題が次のとおりであることは間違いありません。

values_list = [i.rstrip('%') for i in values_list]

これ'%'により、各値の末尾から文字が削除されますが、'%'他の場所の文字は削除されません。典型的な CSV ファイルでは、これでは十分ではありません。

私の推測では、次のような行があると思います。

foo , 10% , bar

これは次のように分割されます。

['foo ', ' 10% ', ' bar\n']

したがって、 to を追加する' 10% 'と、values_listrstripは何もしません。'%'' '

または、代わりに、次のようにすることもできます。

foo,bar,10%

だからあなたはこれを得る:

['foo', 'bar', '10%\n']

...同じ問題があります。

これ (いずれかのバージョン) が問題である場合は、次のようにします。

values_list = [i.strip().rstrip('%')` for i in values_list]

一方、リスト内包表記を取り除くだけで、これをより簡単にすることができます。単一の値を追加するときに修正できるのに、なぜすべての行を後で修正しようとするのでしょうか。例えば:

for line in file:
    line_list = line.split(',')
    value = line_list[index]
    value = value.rstrip('%')
    value = float(value)
    values_list.append(value)
return values_list

そして今では、読みにくくすることなく複数の行をマージできるほど単純になっています。


もちろん、まだ対処する必要があります'N/A'0.0問題は、それを、またはとして扱うかNone、スキップするか、または別のことを行うかですが、コードをより堅牢にするために、 をチェックする代わりに をtry使用することを検討してください。例えば:float'N/A'

value = value.rstrip('%')
try:
    value = float(value)
except ValueError as e:
    # maybe log the error, or log the error only if not N/A, or...
    pass # or values_list.append(0.0), or whatever
else:
    values_list.append(value)

ところで、この種のものを扱うことがまさにモジュールを使用すべき理由です。csv

使用方法は次のとおりですcsv。これの代わりに:

for line in file:
    line_list = line.split(',')

これを行うだけです:

for line_list in csv.reader(file):

それは複雑ですか?

そして、空白を取り除くことですべての微妙な点を処理します (そして、引用とエスケープ、およびテストするのを忘れる他のあらゆる種類のナンセンス)。

言い換えれば、ほとんどの場合、 を使用csvしていれば、コードを 1 行節約するだけでなく、最初からこの問題に遭遇することはなかったでしょう。また、次の 10 個の問題のうち 8 個についても同じことが言えます。に遭遇する。

しかし、複雑すぎると考えるインストラクターから学んでいる場合はcsv…まあ、自分で物事を理解し、クラスの外で質問するのに十分な動機があるのは良いことなので、いくつかの希望があります…</p>

于 2013-03-20T01:40:54.170 に答える