2

多数の CSV ファイルをマージしようとしています。私の初期機能は次のことを目的としています。

  • ディレクトリ内を調べて、その中のファイルの数を数えます (すべてが .csv であると仮定します)
  • 最初の CSV を開き、各行をリストに追加します
  • 上の 3 行を切り取ります (必要のない無用な列タイトル情報があります)
  • これらの結果を「アーカイブ」と呼ばれるリストに保存します
  • 次の CSV ファイルを開き、繰り返します (クリップして「アーカイブ」に追加します)。
  • CSV ファイルがなくなったら、完全な「アーカイブ」を別のフォルダーのファイルに書き込みたいと思いました。

たとえば、次のような 3 つの CSV ファイルから始めるとします。

CSV 1

[]
[['Title'],['Date'],['etc']]
[]
[['Spam'],['01/01/2013'],['Spam is the spammiest spam']]
[['Ham'],['01/04/2013'],['ham is ok']]
[['Lamb'],['04/01/2013'],['Welsh like lamb']]
[['Sam'],['01/12/2013'],["Sam doesn't taste as good and the last three"]]

CSV2

[]
[['Title'],['Date'],['etc']]
[]
[['Dolphin'],['01/01/2013'],['People might get angry if you eat it']]
[['Bear'],['01/04/2013'],['Best of Luck']]

CSV3

[]
[['Title'],['Date'],['etc']]
[]
[['Spinach'],['04/01/2013'],['Spinach has lots of iron']]
[['Melon'],['02/06/2013'],['Not a big fan of melon']]

その最後に、家に帰って次のようなものを手に入れました...

CSV出力

[['Spam'],['01/01/2013'],['Spam is the spammiest spam']]
[['Ham'],['01/04/2013'],['ham is ok']]
[['Lamb'],['04/01/2013'],['Welsh like lamb']]
[['Sam'],['01/12/2013'],["Sam doesn't taste as good and the last three"]]
[['Dolphin'],['01/01/2013'],['People might get angry if you eat it']]
[['Bear'],['01/04/2013'],['Best of Luck']]
[['Spinach'],['04/01/2013'],['Spinach has lots of iron']]
[['Melon'],['02/06/2013'],['Not a big fan of melon']]

だから...私はこれを書き始めました:

import os
import csv

path = './Path/further/into/file/structure'
directory_list = os.listdir(path)
directory_list.sort()

archive = []

for file_name in directory_list:
    temp_storage = []
    path_to = path + '/' + file_name
    file_data = open(path_to, 'r')
    file_CSV = csv.reader(file_data)
    for row in file_CSV:
        temp_storage.append(row)
    for row in temp_storage[3:-1]:
        archive.append(row)

archive_file = open("./Path/elsewhere/in/file/structure/archive.csv", 'wb')
wr = csv.writer(archive_file)
for row in range(len(archive)):
    lastrow = row
    wr.writerow(archive[row])
print row

これは機能しているようです...出力ファイルを確認すると、最後の近くの奇妙なポイントで書き込みが停止しているように見えます」

例えば:

[['Spam'],['01/01/2013'],['Spam is the spammiest spam']]
[['Ham'],['01/04/2013'],['ham is ok']]
[['Lamb'],['04/01/2013'],['Welsh like lamb']]
[['Sam'],['01/12/2013'],['Sam doesn't taste as good and the last three']]
[['Dolphin],['01/01/2013'],['People might get angry if you eat it']]
[['Bear'],['01/04/2013'],['Best of Luck']]
[['Spinach'],['04/0

それは本当に奇妙です、私は何がうまくいかなかったのか理解できません。うまく書いているように見えましたが、リストエントリの途中でさえやめることにしました。それをさかのぼると、これは私の最後の書き込み「forループ」と関係があると確信していますが、csvメソッドにはあまり慣れていません。ドキュメントを一読しましたが、まだ困惑しています。

どこが間違っているのか、どうすれば修正できるのか、おそらくこれらすべてについてもっと良い方法があるかどうか、誰か指摘できますか!

どうもありがとう -ふう

4

1 に答える 1

8

スクリプトが終了する前にファイルハンドルを閉じます。ファイルハンドルを閉じると、書き込み待ちの文字列もフラッシュされます。フラッシュせずにスクリプトが終了すると、一部の出力が書き込まれない可能性があります。

この構文を使用すると、Python が-suitewith open(...) as fを離れるときにファイルが閉じられるので便利です。withを使用withすると、ファイルを閉じる操作を省略できなくなります。

with open("./Path/elsewhere/in/file/structure/archive.csv", 'wb') as archive_file:
    wr = csv.writer(archive_file)
    for row in archive:
        wr.writerow(row)
    print row
于 2013-04-02T19:12:19.677 に答える