Impor csv: hapus nama file dari nama kolom di baris pertama
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:
- Entah saya bisa mulai dengan fungsi untuk memotong n tanda pertama, karena panjangnya tetap atau
- Menurut solusi ini gunakan saja
string.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
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]]