3

324行495列の値の配列を含むcsvファイルがあります。各行と列の値はすべて同じです。

この配列を分割して、10個ごとの値が新しい行に配置されるようにする必要があります。したがって、324行のそれぞれについて、10個の値を持つ49個の完全な列と5個の値を持つ1個の列があります(495列/ 10個の値=10個の値を持つ49個の新しい行と5個の値を持つ1個の新しい行)。次に、次の行に移動し、324行を続けます。

私が抱えている問題は次のとおりです。

  1. line.split( "、")は何もしていないようです
  2. line.splitの後のすべては何もしないようです
  3. 範囲内の新人がわからない...正しい
  4. 私はまだテキストファイルへの書き込み出力を入れていません、私はそれがoutFile.writeであるべきだと思います(何かがここにあります、何がわかりません)
  5. printステートメントの後に「\n」を付けましたが、出力されました

私は初心者プログラマーです。

脚本:

import string
import sys

# open csv file...in read mode
inFile= open("CSVFile", 'r')
outFile= open("TextFile.txt", 'w')


for line in inFile:
    elmCellSize = line.split(",")
    for newrow in range(0, len(elmCellSize)):
        if (newrow/10) == int(newrow/10):
            print  elmCellSize[0:10]   

outFile.close()
inFile.close()
4

2 に答える 2

0

csv モジュールを実際に使用する必要がありますが、とにかくアドバイスをすることができます。

あなたが抱えている問題の 1 つは、 と言うときprint elmCellSize[0:10]、最新の 10 要素ではなく、常に最初の 10 要素を取得していることです。これをどのように行うかによって、文字列を保持して最新の 10 個の要素を記憶することができます。コードで修正できるいくつかの点について言及した後、以下に例を示します。

line.split(',')リストを返す最初のメモ。したがって、変数名の選択はelmCellSize少し誤解を招きます。と言ったらlineList = line.split(',')、もっと分かりやすいかも?または、それを言っlineSize = len(line.split(','))て使用するとしたら?

また (Python 2.x については何も知りませんが) はPython 2.x 用の関数であり、まったく同じように動作しますが、xrangeよりも効率的だと思います。range

と言う代わりにif (newrow/10) == int(newrow/10)、実際にはif index % 10 == 0、インデックスが 10 の倍数であるかどうかを確認するため にと言うこと%ができます。(例: 5 % 10 = 5; 17 % 10 = 7; 30 % 10 = 0)newrow10

[0:10]常に最初の 10 要素を出力する print の代わりに、現在のインデックスから 10 スペース分後ろに出力します。print lineList[index-10:index]したがって、最新の 10 個の要素を出力するために言うことができます。

最終的には、次のようなものになります

...
lineList = line.split(',') # Really, you should use csv reader
# Open the file to write to
with open('yourfile.ext', 'w') as f:
    # iterate through the line
    for index, value in enumerate(lineList):
        if index % 10 == 0 and index != 0:
            # Write the last 10 values to the file, separated by commas
            f.write(','.join(lineList[index-10:index]))
            # new line
            f.write('\n')
            # print
            print lineList[index-10:index]

私は確かに専門家ではありませんが、これが役立つことを願っています!

于 2013-02-11T21:34:50.687 に答える
0

わかりました、このスクリプトはほとんど機能すると思います。

現在の問題は、最初の 49 行の後に outFile への書き込みが停止することです。49 行で 10 列になりますが、CSV ファイルの各行は 495 列であるため、5 列しかない 50 番目の行が必要です。そのため、現在のスクリプトは最後の 10 個の値を新しい行に 49 回書き出しますが、余分な 5 を取得しません。さらに、元の CSV ファイルには 324 行あるため、これをさらに 323 回行う必要があります。

したがって、問題はおそらく最後の if ステートメントにあると思います。else ステートメントが必要かもしれませんが、elif ステートメントは何もしませんでした。リストの 6 番目の値が行末文字 ('\n') である場合は、5 つの値をリストの前に行末に書き込んでください...うまくいきませんでした。

これまでご協力いただきありがとうございました。

スクリプトは次のとおりです。

import string
#import sys
#import csv

# open csv file...in read mode
inFile= open("CSVFile.csv", 'r')
outFile= open("TextFile.txt", 'w')



for line in inFile:
    lineList = line.split(',') # Really, you should use csv reader
# Open the file to write to
    with open('outFile', 'w') as outFile:
        # iterate through the line
        for index, value in enumerate(lineList):
            if index % 10 == 0 and index != 0:
                # Write the last 10 values to the file, separated by space
                outFile.write('\t'.join(lineList[index-10:index]))
                # new line
                outFile.write('\n')
                # print
                print lineList[index-10:index]
elif lineList[6] == '\n':
            # Write the last 5 values to the file, separated by space
                outFile.write(' '.join(lineList[index-5:index]))
                # new line
                outFile.write('\n')
                # print
                print lineList[index-:index]

outFile.close()
inFile.close()
于 2013-02-12T15:47:01.297 に答える