csvのインポート:最初の行の列名からファイル名を削除します

Dec 01 2020

Python3.5を使用しています。私はいくつかのcsvファイルを持っています:

csvファイルは、固定構造に従って名前が付けられます。それらには、固定プレフィックス(常に同じ)とさまざまなファイル名部分があります。

099_2019_01_01_filename1.csv
099_2019_01_01_filename2.csv

私の元のcsvファイルは次のようになります。

filename1-Streetname filename1-ZIPCODE
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
Name1 2012932
Name2 3023923

次のコードを使用してこれらのファイルを操作しています(ソースフォルダーからcsvファイルを読み取り、宛先フォルダーに書き込みます。この情報を含めたくないため、特定の行をスキップします)。

TEXT行は必要ないので、切り取ります。

import csv
    
skiprows = (1,2,3,4,5,6)
for file in os.listdir(sourcefolder):
    with open(os.path.join(sourcefolder,file)) as fp_in:
        reader = csv.reader(fp_in, delimiter=';')
        rows = [row for i, row in enumerate(reader) if i not in skiprows]
        with open(os.path.join(destinationfolder,file), 'w', newline='') as fp_out:
            writer = csv.writer(fp_out)
            writer.writerows(rows)

(このコードは機能します)

filename1-Streetname filename1-ZIPCODE
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
Name1 2012932
Name2 3023923

最初の行にはヘッダーが含まれています。ヘッダー名には、常にファイル名(ただし、099_2019_01_01_プレフィックスなし)と「-」が含まれます。.csvで終わるファイル名がありません。csvファイルごとにこの「ファイル名-」を削除したいと思います。

ここでのコア部分は、最初の行を取得し、この行のみが置換を実行することです。プレフィックスと.csvを切り取ってから、一般的な置換を実行する必要があります。最初の置換は次のようになります。

  1. 長さが固定されているので、最初のn個の記号を切り取る関数から始めることができます。
  2. このソリューションによると、string.removeprefix('099_2019_01_01_')

私はPython3.5を持っているので、removeprefixを使用できないので、単純に置き換えるようにしています。

string.replace( "099_2019_01_01 _"、 "")

次に、簡単な.csvを削除する必要があります。

string.replace(".csv","")

これをまとめると(string.replace("099_2019_01_01_","")).replace(".csv","")。(さらに、最後に「-」も削除する必要があります。以下のコードを参照してください)。これが機能するかどうかはわかりません。

私の主な問題は、このcsvインポートコードで、csvの読み取り/書き込み時に最初の行のみを操作する方法がわからないことです。だから私はこれを最初の行だけで置き換えたいと思います。私はこのようなことを試みました:

import csv
    
skiprows = (1,2,3,4,5,6)
for file in os.listdir(sourcefolder):
    with open(os.path.join(sourcefolder,file)) as fp_in:
        reader = csv.reader(fp_in, delimiter=';')
        rows = [row for i, row in enumerate(reader) if i not in skiprows]
        with open(os.path.join(destinationfolder,file), 'w', newline='') as fp_out:
            writer = csv.writer(fp_out)
            rows[0].replace((file.replace("099_2019_01_01_","")).replace(".csv","")+"-","")
            writer.writerows(rows)

rows [0]のアイデアが機能していないため、これによりエラーが発生します。これどうやってするの?

(この置換をコードに含めるか、最初のコードの後に​​実行される2番目のコードに入れるかはわかりません。ただし、csvファイルの読み取りと書き込みを再度行うと思います。したがって、そうなると思います。このコードに実装するのが最も効率的です。それ以外の場合は、すべてのファイルを開いて変更し、再度保存する必要があります。ただし、このコードに含めることができない場合は、スタンドアロンで実行されるコードでも問題ありません。 csvファイルのヘッダーとして行0があり、データが来ると仮定して、置換を行うだけです。)

私はcsvを使用してこの方法を使用し、パンダは使用しないことに注意してください。

編集:最後に、csvファイルは次のようになります:

Streetname ZIPCode
Street1 9999
Street2 9848

Name Phone
Name1 23421
Name2 23232

回答

1 IoaTzimas Dec 01 2020 at 13:58

これを置き換えてみてください:

rows[0].replace((file.replace("099_2019_01_01_","")).replace(".csv","")+"-","")

あなたのコードでこれによって:

x=file.replace('099_2019_01_01_','').replace('.csv', '')
rows[0]=[i.replace(x+'-', '') for i in rows[0]]