1

これは、今後のプロジェクトを完成させるのに役立つ具体的な質問です。それは非常に単純です。私は Python を初めて使用し、私のバックグラウンドは主に芸術です。私はそれが好きですが、それは非常に難しいことでもあります。

次のような番号/名前のリストを含むテキスト ファイル (Data.txt) があります (短い例):

String 1
34.6
45.6
45.9
String 2
34.6
45.6
45.9  

これは混合リストです。各文字列の後に....12 個の数字が続きます。数値が「浮動」であることに注意してください。

私はこれを設計しました:

numberList = []
data = []
data = open("SalesData.txt").read().split()
for i in data:
        numberList.append(i)
print numberList

これにより、外部の .txt リストにすべてのデータが追加されて出力されます。ファイルの読み取りで見つかったすべての「文字列」を除外して、新しいリスト (numberList) 内のすべてのデータを取得するにはどうすればよいですか。このようにして、数字だけの合計を実行できます ---

4

6 に答える 6

2

まず、ファイルに対して行うべきではありません.read().split()-改行だけでなく、空白で分割されます。幸いなことに、Python はファイルを直接反復処理できます。

次に、各行をフロートに変換し、それが機能する場合にのみリストに追加します (そうでない場合はスキップします)。また、すぐにフロートに変換できます - 合計が簡単になります。

number_list = []
with open("SalesData.txt") as myfile:
    for line in myfile:
        try:
            number_list.append(float(line))
        except ValueError:
            pass
print(sum(number_list))
于 2012-12-01T21:12:42.487 に答える
1

データが構造化されている場合 (そのようです)、単純にカウンターを使用して、len 12 の各シーケンスの最初の要素を削除します。

次に例を示します。

numberList = []
data = []
counter = 0
with open("SalesData.txt") as myfile:
    for line in myfile:
        if counter > 0:
            number_list.append(float(line))
        counter = (counter + 1) % 12
print numberList
于 2012-12-01T21:15:27.320 に答える
1

行を繰り返し、リストに数字を追加するだけです...

with open("somefile.txt") as f:
     my_list = []
     for line in f:
         try:
            my_list.append(float(line))
         except ValueError:
             pass

print sum(my_list)
于 2012-12-01T21:11:24.467 に答える
0
import re

ss =  '''String 1 
34.6 
45.6 
45.9 
String 2 
34.6 
45.6 
45.9 

'''

print re.findall('^(?!.*?[a-zA-Z])[0-9.+-]+',ss,re.MULTILINE)

しかし、ASCII でない文字が存在する可能性がある場合、それは機能しません。

于 2012-12-01T21:22:37.527 に答える
0

これを試して:

tsum = []
for j in numberList:
    try: tsum.append(float(j))
    except: pass
sum = sum(tsum)
于 2012-12-01T21:10:29.947 に答える
0

型チェックを行うか、数値が実際に文字列の数字である場合は、"13".isdigit()チェックのようなことを行うことができますが、おそらくもう少し賢いことをしたいと思います:

numberList = []

for i in range(0, len(data)/13):
    numberList.append(data[1*(i+1):13*(i+1)])

それ(またはそれに似たもの)は、文字列の後の数字のグループをターゲットにする必要があります。これは、入力データがジャンクでないかどうかに依存しますが、大規模なデータセットでは.isdigit()、他の型チェックを行うよりも速く動作するはずです。

于 2012-12-01T21:11:53.380 に答える