Impor csv: hapus nama file dari nama kolom di baris pertama

Dec 01 2020

Saya menggunakan Python 3.5. Saya memiliki beberapa file csv:

File csv diberi nama sesuai dengan struktur tetap. Mereka memiliki awalan tetap (selalu sama) ditambah bagian nama file yang bervariasi:

099_2019_01_01_filename1.csv
099_2019_01_01_filename2.csv

File csv asli saya terlihat seperti ini:

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

Saya memanipulasi file-file ini menggunakan kode berikut (Saya membaca file csv dari folder sumber dan menulisnya ke folder tujuan. Saya melewatkan baris tertentu karena saya tidak ingin menyertakan informasi ini):

Saya memotong baris TEXT, karena saya tidak membutuhkannya:

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)

(kode ini berfungsi) memberi

filename1-Streetname filename1-ZIPCODE
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
Name1 2012932
Name2 3023923

Baris pertama berisi tajuk. Dalam nama header selalu ada nama file (namun tanpa awalan 099_2019_01_01_) ditambah "-". Nama file yang diakhiri dengan .csv tidak ada. Saya ingin menghapus "nama file-" ini untuk setiap file csv.

Bagian inti sekarang adalah mendapatkan baris pertama dan hanya baris ini yang melakukan penggantian. Saya perlu memotong awalan dan .csv dan kemudian melakukan penggantian umum. Penggantian pertama bisa jadi seperti ini:

  1. Entah saya bisa mulai dengan fungsi untuk memotong n tanda pertama, karena panjangnya tetap atau
  2. Menurut solusi ini gunakan sajastring.removeprefix('099_2019_01_01_')

Karena saya memiliki Python 3.5, saya tidak dapat menggunakan removeeprefix jadi saya mencoba menggantinya dengan sederhana.

string.replace ("099_2019_01_01_", "")

Maka saya perlu menghapus .csv yang mudah:

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

Saya mengumpulkan ini dan saya dapatkan (string.replace("099_2019_01_01_","")).replace(".csv",""). (Plus di akhir "-" perlu juga dihapus, lihat kode di bawah). Saya tidak yakin apakah ini berhasil.

Masalah utama saya sekarang untuk kode impor csv ini yang saya tidak tahu bagaimana saya hanya dapat memanipulasi baris pertama saat membaca / menulis csv. Jadi saya ingin mengganti ini hanya di baris pertama. Saya mencoba sesuatu seperti ini:

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)

Ini memberikan kesalahan karena gagasan dengan baris [0] tidak berfungsi. Bagaimana saya bisa melakukan ini?

(Saya tidak yakin apakah saya harus mencoba memasukkan penggantian ini ke dalam kode atau memasukkannya ke dalam kode kedua yang berjalan setelah kode pertama. Namun, kemudian saya akan membaca dan menulis file csv lagi, saya berasumsi. Jadi saya pikir itu akan terjadi menjadi paling efisien untuk menerapkannya ke dalam kode ini. Jika tidak, saya perlu membuka dan mengubah serta menyimpan setiap file lagi. Namun, jika tidak memungkinkan untuk memasukkannya ke dalam kode ini, saya juga akan baik-baik saja dengan kode yang berjalan mandiri dan hanya melakukan penggantian dengan asumsi file csv memiliki baris 0 sebagai header dan kemudian datanya datang.)

Harap dicatat bahwa saya ingin menggunakan cara ini dengan csv dan tidak menggunakan panda.

EDIT: Pada akhirnya file csv akan terlihat seperti ini:

Streetname ZIPCode
Street1 9999
Street2 9848

Name Phone
Name1 23421
Name2 23232

Jawaban

1 IoaTzimas Dec 01 2020 at 13:58

Coba dengan mengganti ini:

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

Dengan ini di kode Anda:

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