2017-06-25 8 views
0

Excelを使用して編集できないCSVファイルがあります。私は行番号を入力せずに上のいくつかの行(ヘッダー行の前)と最後の行を削除する動的なコードを作成したい。私が今使っているコードは:Pythonを使用してCSVファイルから最上行と最下行を削除する方法

FIRST_ROW_NUM = 1 
ROWS_TO_DELETE = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 5421344} 
with open('filename', 'r') as infile,open('filename', 'w') as outfile: 
    outfile.writelines(row for row_num, row in enumerate(infile, FIRST_ROW_NUM) 
        if row_num not in ROWS_TO_DELETE) 

このコードの問題は、それらを削除するために手動で行番号を入力する必要があります。

私が持っているもう1つの問題は、削除する行数が一定でなく、ファイルからファイルに変化することです。

サンプルCSVは、私は何とか私の側からの入力なしに、それらの行を削除することができ、コードをしたいhere

が装着されています。

注:ありCSVの最後の行についての情報はありませんが、それはこのようなものです:

Grand Total: - - - - - - - - - - - - - - - - - - - - - - - - - - 
+0

「ヘッダー行まで」とは、ヘッダー行も削除することを意味しますか、ヘッダー行の前の行のみを削除しますか?ファイル内の他の行と区別するために使用できるヘッダー行、または前または後続行の特徴はどんなパターンですか? –

+0

申し訳ありませんが間違いでした。私は@rd_nielsenの質問を編集しました – PyNoob

答えて

0

itertools dropwhiletakewhile機能の使用が行を取り出すために:行またはNaNの前の行は、あなたがこれを使用することができます場合は、動的については あなたがしたい:それはReport Fieldsを含む最初の列と行を見つけるまで

import itertools  
import csv 

with open('Test.csv', newline='') as f_input, open('output.csv', 'w', newline='') as f_output: 
    csv_input = csv.reader(f_input) 
    csv_output = csv.writer(f_output) 

    # Skip over initial lines until the header row 
    next(itertools.dropwhile(lambda x: x[0] != "Report Fields", csv_input)) 

    # Write rows until the total row is found 
    csv_output.writerows(itertools.takewhile(lambda x: "Grand Total" not in x[0], csv_input)) 

これは、CSVファイルの各行を読み取ります。次に、この行をスキップします。これで、最初の列エントリに単語Grand Totalが含まれ、その後停止するまで、残りのすべての行が出力CSVファイルに書き込まれます。

+0

エラー:イテレータはバイトではなく文字列を返す必要があります(テキストモードでファイルを開いたのですか?私はrbとwbをそれぞれrtとwtに置き換えて実行しましたが、outファイルにはヘッダを除いて何もありません。 @MartinEvans – PyNoob

+0

私はスクリプトを更新しました。Python 2.x用に設計されました。エラーメッセージはPython 3.xを使用していることを意味します –

+0

ファイルを作成していないたびに新しいファイルを作成する必要がありますか?また、今は** UnsupportedOperation:writable **のエラーがあります。これは、ファイルが読み取り専用の状態で開かれている可能性があるためです。私はかなり初心者であり、このすべてを通して自分のやり方を強要しているので、私を抱きしめてください。 @MartinEvans – PyNoob

0

は、あなたの入力および出力ファイルを開き、:

for line in infile: 
    if <line matches header row>: 
     break 
outfile.write(line) 
for line in infile: 
    if <line matches grand total line>: 
     break 
    outfile.write(line) 
+0

新しいファイルをoutfileとして作成したいと思います。また、** <行がヘッダー行に一致する>と言っているときは、ヘッダー行をリストとして保存する必要がありますか? – PyNoob

+0

その行をどのように扱うかは、ヘッダー行かどうかを調べるためにチェックする必要があるかどうかによって異なります。私はあなたが部分列検索や正規表現を使用して、列見出しのいくつかの既知の値に一致する可能性が最も高いと思います。 –

0

を私は」最初にファイル全体を文字列として読み込み、読み取ろうとしているデータフレームのインジケータのように分割します。'Report Fields'。そして、あなたは改行で分割し、すべてが、あなたはそれを行うにはパンダとread_csvモジュールを使用することができます[:-1]

with open('infile.csv', 'r') as infile, open('outfile.csv', 'w') as outfile: 
    txt = infile.read().split('Report Fields')[1] 
    outfile.write('\n'.join(txt.split('\n')[1:-1])) 
+0

エラーが発生します。** TypeError:期待されるstr、bytes、またはos.PathLikeオブジェクトで、_ioではありません。TextIOWrapper ** @piRSquared – PyNoob

+0

エラーはどこにありますか。私が書いたことは私のために働く。 – piRSquared

+0

これは現在実行中ですが、他のファイルと一緒に使用するとすべてが削除されます@piRSquared – PyNoob

0
import pandas as pd 
df = pd.read_csv('file_name.csv', skiprows=27) 
df.drop(df.index[5421327]) #5421327 = 5421344-27 

と最後を含め、リストにインデックスを付けることにより、最後の行を排除することができます。 Skiprowsは、ファイルの先頭でスキップする行番号(0で索引付けする)またはスキップする行数(int)を定義します。 そして最後に5421344のインデックスのドロップコラム。

静的な値です。これはファイルの解析を支援するために、Pythonのcsvライブラリを使用して行われ、することができ

import pandas as pd 
df = read_csv('file_name', skiprows=1) 
df.dropna(axis=0, inplace=True) 
df.drop(df.iloc[-1]) 
関連する問題