0

2 列と 21 行のデータを含む 125 個のデータ ファイルがあり、それらを 1 つの .csv ファイルにインポートしたいと考えています (125 組の列と 21 行のみ)。これは私のデータファイルがどのように見えるかです:

ここに画像の説明を入力

私はPythonにかなり慣れていませんが、次のコードを思いつきました:

import glob
Results = glob.glob('./*.data')
fout='c:/Results/res.csv'
fout=open ("res.csv", 'w')
 for file in Results:
 g = open( file, "r" )
 fout.write(g.read())
 g.close() 
fout.close()

上記のコードの問題は、すべてのデータが 125*21 行の 2 つの列だけにコピーされることです。

どんな助けでも大歓迎です!

4

3 に答える 3

1

これはうまくいくはずです:

import glob

files = [open(f) for f in glob.glob('./*.data')] #Make list of open files
fout = open("res.csv", 'w')

for row in range(21):
    for f in files:
        fout.write( f.readline().strip() ) # strip removes trailing newline
        fout.write(',')
    fout.write('\n')

fout.close()

多数のファイルを試すと、この方法はおそらく失敗することに注意してください。Python のデフォルトの制限は 256 だと思います。

于 2012-04-23T01:27:53.283 に答える
1

(申し訳ありませんが、まだコメントを追加できません。)

[後で編集、次のステートメントは間違っています!!!] 「davesnitty が生成する行ループはrows = [[]] * 21. これは空のリストのリストを作成するので間違っていますが、空のリストは外側のリストのすべての要素によって共有される単一の空のリストになります。

標準の csv モジュールの使用に対する私の +1。ただし、ファイルは常に閉じておく必要があります。特に、多くのファイルを開く場合は特にそうです。また、バグがあります。ここに結果を書き込むだけですが、 -- を介してファイルから読み取られた行。解決策は実際にはありません。基本的に、ファイルから読み取った行は、行番号に関連するサブリストに追加する必要があります。行番号は enumerate(reader) を介して取得する必要があります。ここで、reader は csv.reader(fin, ...) です。

[後で追加]次のコードを試して、puprose のパスを修正します。

import csv
import glob
import os

datapath = './data'
resultpath = './result'
if not os.path.isdir(resultpath):
   os.makedirs(resultpath)

# Initialize the empty rows. It does not check how many rows are
# in the file.
rows = []

# Read data from the files to the above matrix.
for fname in glob.glob(os.path.join(datapath, '*.data')):
    with open(fname, 'rb') as f:
        reader = csv.reader(f)
        for n, row in enumerate(reader):
            if len(rows) < n+1:
                rows.append([])  # add another row
            rows[n].extend(row)  # append the elements from the file

# Write the data from memory to the result file.
fname = os.path.join(resultpath, 'result.csv')
with open(fname, 'wb') as f:
    writer = csv.writer(f)
    for row in rows:
        writer.writerow(row)
于 2012-04-23T11:51:10.857 に答える
1

Python CSV モジュール (http://docs.python.org/library/csv.html) を試してみることをお勧めします。これは、CSV ファイルを読み書きするための非常に便利な方法を提供します。250 列のデータを含む 21 行のみが必要であると述べたので、行として 21 個の Python リストを作成し、ファイルをループするときに各行にデータを追加することをお勧めします。

何かのようなもの:

import csv

rows = []
for i in range(0,21):
    row  = []
    rows.append(row)

#not sure the structure of your input files or how they are delimited, but for each one, as you have it open and iterate through the rows, you would want to append the values in each row to the end of the corresponding list contained within the rows list.

#then, write each row to the new csv:

writer = csv.writer(open('output.csv', 'wb'), delimiter=',')
for row in rows:
    writer.writerow(row)
于 2012-04-23T01:38:38.963 に答える