0

Python CSV モジュールを使用して、追加用の CSV ファイルを開きたいと考えています。次に、CSVファイルのリストから、各csvファイルを読み取り、追加されたCSVファイルに書き込みたいと思います。私のスクリプトはうまく機能しますが、最初に読み取られる CSV ファイル以外のすべてからヘッダーを削除する方法が見つかりません。私elseのコード ブロックが正しく実行されていないことは確かです。おそらく私のif elseコードの構文が問題なのでしょうか? 任意の考えをいただければ幸いです。

writeFile = open(append_file,'a+b')
writer = csv.writer(writeFile,dialect='excel')
    for files in lstFiles:
        readFile = open(input_file,'rU')
        reader = csv.reader(readFile,dialect='excel')
        for i in range(0,len(lstFiles)):
            if i == 0:
                oldHeader = readFile.readline() 
                newHeader = writeFile.write(oldHeader) 
                for row in reader: 
                    writer.writerow(row)
            else:
                reader.next()
                for row in reader:
                    row = readFile.readlines()
                    writer.writerow(row)
        readFile.close()
writeFile.close() 
4

2 に答える 2

1

lstFiles を効果的に 2 回繰り返しています。リスト内の各ファイルに対して、内側の for ループを 0 から実行しています。次のようなものが必要です。

writeFile = open(append_file,'a+b')
writer = csv.writer(writeFile,dialect='excel')
headers_needed = True
for input_file in lstFiles:
    readFile = open(input_file,'rU')
    reader = csv.reader(readFile,dialect='excel')
    oldHeader = reader.next()
    if headers_needed:
        newHeader = writer.writerow(oldHeader)
        headers_needed = False 
    for row in reader:
        writer.writerow(row)
    readFile.close()
writeFile.close()

lstFiles を使用enumerateして、反復回数とファイル名を含むタプルを反復処理することもできますが、ブール値の方がロジックをより明確に示していると思います。

おそらく、csv リーダーの反復処理と、基になるファイルの readline の直接呼び出しを混在させたくないでしょう。

于 2013-05-15T17:38:24.843 に答える
0

あなたは何度も繰り返していると思います(さまざまなことについて:ファイルのリストとファイル自体の両方)。一貫性の問題がいくつかあることは間違いありません。変数の初期化を確認できないため、確認するのは少し困難です。これはあなたが欲しいと思うものです:

with open(append_file,'a+b') as writeFile:
    need_headers = True
    for input_file in lstFiles:
        with open(input_file,'rU') as readFile:
            headers = readFile.readline()
            if need_headers:
                # Write the headers only if we need them
                writeFile.write(headers)
                need_headers = False
            # Now write the rest of the input file.
            for line in readFile:
                writeFile.write(line)

この操作に使用する理由がないため、csv 固有のものをすべて取り出しました。i == 0また、ファイルをコンテキスト マネージャーとして使用し、「マジック」チェックの代わりに適切な名前のブール値を使用して、コードを大幅にクリーンアップして、コードを簡単に理解できるようにしました。その結果、(うまくいけば) 何が起こっているのかを理解するために面倒な手順を踏む必要のない、より優れたコード ブロックが作成されます。

于 2013-05-15T17:43:23.850 に答える