5

2列と21行のデータを含む125個のデータファイルがあります。下の画像をご覧ください。

ここに画像の説明を入力してください

そして、それらを単一の.csvファイル(250列と21行)にインポートしたいと思います。

私はPythonにかなり慣れていませんが、これは私がアドバイスしたことであり、コード的には次のとおりです。

import glob
Results = [open(f) for f in glob.glob("*.data")] 
fout = open("res.csv", 'w')

for row in range(21):
 for f in Results:
  fout.write( f.readline().strip() ) 
  fout.write(',')
 fout.write('\n')
fout.close()

ただし、125列しかないため、コードにわずかな問題があります(つまり、力と変位の列は1つの列に書き込まれます)。下の画像を参照してください。 ここに画像の説明を入力してください

ここに画像の説明を入力してください

誰かがこれを手伝ってくれたらとてもありがたいです!

4

4 に答える 4

8
import glob
results = [open(f) for f in glob.glob("*.data")]
sep = ","
# Uncomment if your Excel formats decimal numbers like 3,14 instead of 3.14
# sep = ";"

with open("res.csv", 'w') as fout:
    for row in range(21):
        iterator = (f.readline().strip().replace("\t", sep) for f in results)
        line = sep.join(iterator)
        fout.write("{0}\n".format(line))

したがって、コードの問題点を説明するために、ソースファイルはフィールド区切り文字としてタブを使用しますが、コードはコンマを使用して、それらのファイルから読み取る行を区切ります。Excelで小数点としてピリオドを使用する場合、デフォルトのフィールド区切り文字としてコンマを使用します。引用符で囲まれていない限り、空白は無視され、結果が表示されます。

Excelのテキストインポート機能(データリボン=>テキストから)を使用する場合は、カンマタブの両方を有効なフィールド区切り文字と見なすように要求できます。そうすれば、元の出力も機能すると確信しています。

対照的に、上記のコードは、ダブルクリックすると正しく開くファイルを生成するはずです。

于 2012-04-23T13:06:50.633 に答える
2

これを行うために、Pythonなどで独自のプログラムを作成する必要はありません。既存のunixコマンドを使用できます(その環境にいる場合)。

paste *.data > res.csv
于 2012-04-23T14:11:05.027 に答える
1

これを試して:

import glob, csv
from itertools import cycle, islice, count

def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    pending = len(iterables)
    nexts = cycle(iter(it).next for it in iterables)
    while pending:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            pending -= 1
            nexts = cycle(islice(nexts, pending))

Results = [open(f).readlines() for f in glob.glob("*.data")] 
fout = csv.writer(open("res.csv", 'wb'), dialect="excel")

row = []
for line, c in zip(roundrobin(Results), cycle(range(len(Results)))):
    splitline = line.split()
    for item,currItem in zip(splitline, count(1)):
        row[c+currItem] = item
    if count == len(Results):
        fout.writerow(row)
        row = []
del fout

入力ファイルの各行をループし、それらを1つの行としてつなぎ合わせます。これは、csvライブラリがリストされた方言に書き込みます。

于 2012-04-23T14:11:14.523 に答える
1

csvモジュールに慣れるのをお勧めします。その理由は、データがそれほど単純でない場合(見出しの単純な文字列、次に数字のみ)、すべてを再度実装することは困難であるためです。次のことを試してください。

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)

withファイルを開くための構成は、次のカップルで置き換えることができます。

f = open(fname, 'wb')
...
f.close()

csv.readerとcsv.writerは、ファイルの行を解析または構成する単なるラッパーです。ドキュメントには、ファイルをバイナリモードで開く必要があると書かれています。

于 2012-04-23T15:37:19.067 に答える