0

私は 2D 配列を作成する任務を負っています。これにより、行を繰り返しループし、セルを長さ 5 の配列に格納できます。私が助けて欲しいのは、最後の5つの値に達してそれらを保存するまでループし続けるように作成する方法です。

例として、.csv ファイルに 6 行あります。

line = "1,9/20/2012, 48.019,34.888,37.334,35.425,36.69,38.916,36.837,39.212,37.528,37.404"
line = "1,9/20/2012, 38.019,54.888,36.334,35.425,36.69,38.916,36.837,39.212,37.528,37.404"
line = "1,9/20/2012, 28.019,31.888,56.334,33.825,36.69,38.916,36.837,39.212,37.528,37.404"
line = "1,9/20/2012, 48.019,34.888,37.334,35.425,36.69,38.916,36.837,39.212,37.528,37.404"
line = "1,9/20/2012, 38.019,54.888,31.334,37.425,33.69,38.916,36.837,39.212,37.528,37.404"
line = "1,9/20/2012, 28.019,31.888,56.334,33.825,36.69,38.916,36.837,39.212,37.528,37.404"

最初の 2 つの値をスキップするようにスクリプトを設定しました [1,9/20/2012]

次に、それらを分離しました。つまり、最初の 5 つの値はhtr12 番目です。htr2 [ 48.019,34.888,37.334,35.425,36.69] [38.916,36.837,39.212,37.528,37.404]

したがって、基本的に私が助けを必要としているのは、列の最後の 5 つの値を取得し、それらを Python の配列またはリストに格納することです。例えば:

htrA[38.019,28.019,48.019,38.019,28.019]
htrB[36.334,56.334,37.334,31.334, 56.334

ここに私がこれまでに持っているコードがあります

inFile = open("input_test.csv", "r")
outFile = open("results.txt", "w")

#To reliably determine steady state temperature average fifoSize last temperature readings
fifoSize = 5        #last fifoSize to average to get final temperature
bufFifo = FiFoBuf(fifoSize) 

#Write Header
#outFile.write('Test Name,X+ avg,X+ std,X+ count,X- avg,X- std,X- count,X angle,Y+ avg,Y+ std,Y+ count,Y- avg,Y- std,Y- count,Y angle\n')

for line in inFile:

    print line
    #Characters of each line as list - items that were separated by commas
    list = line.rstrip().replace(' ','').split(',')
    list = list[2:]     #remove index and date code (1st 2 items of list)

    htr1 = list[0:5]    #1st heater temperatures
    htr2 = list[6:10]   #2nd heater temperatures



    print "\nhtr1: "
    print htr1
    print "\nchDeviation(htr1): "
    print chDeviation(htr1)

    avg()
#printStats()

inFile.close()
outFile.close()
4

4 に答える 4

0

csvこれは、モジュールを使用せず、代わりにファイル自体の各行を読み取って解析する、私の回答の改訂版です。

htrA = []
htrB = []
with open("input_test.csv", "rt") as inFile:
    for line in inFile:
        line = [float(value) for value in line.split(',')[2:]] # skips first 2 cols
        htr1 = line[0:5]
        htr2 = line[5:10]
        htrA.append(htr1[0])
        htrB.append(htr1[1])

htr2d = [htrA[-5:], htrB[-5:]]  # want just the last 5 rows
print 'htr2d:'
for row in htr2d:
    print '  ', row

出力:

htr2d:
   [38.019, 28.019, 48.019, 38.019, 28.019]
   [54.888, 31.888, 34.888, 54.888, 31.888]

を使用して、htr2dの個々の要素にアクセスできますhtr2d[row][column]
例えば:

print htr2d[0][3]  # 38.019
于 2012-10-31T16:38:06.467 に答える
0

列ごとに新しいリストcolumnX=[]を作成し、各行を呼び出しcolumnX.append(item)てすべての X 番目の要素を収集します。

column0.append(line[0])
column1.append(line[1])
#...
于 2012-10-31T16:24:18.303 に答える
0

最後の 5 行だけが必要なので、unix コマンドtail -n 5を使用して最後の 5 行だけを取得できます。次に、各行を読み、必要に応じて追加するだけです。

それが不可能な場合 (UNIX コマンドを使用できないため)、次のように Python で単純なバージョンを作成できます。

for line in file.readlines()[-5:]:
     #do whatever appending you need to do     

ファイルが非常に大きい場合は、5 つの改行を読み取ってから改行に分割するまで、ファイルの最後から逆方向に読み取ることができます。そのためのレシピがあります。

于 2012-10-31T16:19:53.453 に答える
0

すべての行をリストに入れ、そこから最後の 5 つの要素 (最後の 5 行) を取得し、行をカンマの周りに分割して、Hans Then が提案するリストのリストを取得します。偽の空白から値を取り除き、zip 関数の小さな魔法を使用して行を転置します。リストのリストを取得しますが、各リストは列の 1 つに対応します

lines1 = [ line1, line2, line3, line4, line5, line6 ]
lines2 = [ [s.strip() for s in l.split(',')[2:]] for l in lines2 ][-5:]
lines3 = zip(*lines2)

print lines3
#[('38.019', '28.019', '48.019', '38.019', '28.019'),
# ('54.888', '31.888', '34.888', '54.888', '31.888'),
# ('36.334', '56.334', '37.334', '31.334', '56.334'),
# ('35.425', '33.825', '35.425', '37.425', '33.825'),
# ('36.69', '36.69', '36.69', '33.69', '36.69'),
# ('38.916', '38.916', '38.916', '38.916', '38.916'),
# ('36.837', '36.837', '36.837', '36.837', '36.837'),
# ('39.212', '39.212', '39.212', '39.212', '39.212'),
# ('37.528', '37.528', '37.528', '37.528', '37.528'),
# ('37.404', '37.404', '37.404', '37.404', '37.404')]
于 2012-10-31T16:24:49.750 に答える