Masalahnya

Saya memiliki file CSV yang berisi banyak item.

Kolom pertama dapat berisi alamat IP atau sampah acak. Satu-satunya kolom lain yang saya pedulikan adalah yang keempat.

Saya telah menulis potongan kode di bawah ini dalam upaya untuk memeriksa apakah kolom pertama adalah alamat IP dan, jika demikian, tulis itu dan konten kolom keempat ke file CSV lain secara berdampingan.

with open('results.csv','r') as csvresults:
    filecontent = csv.reader(csvresults)
    output = open('formatted_results.csv','w')
    processedcontent = csv.writer(output)

    for row in filecontent:
        first = str(row[0])
        fourth = str(row[3])
        if re.match('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', first) != None:
            processedcontent.writerow(["{},{}".format(first,fourth)])
        else:
            continue
    output.close()

Ini bekerja sampai batas tertentu. Namun, saat melihat di Excel, kedua item ditempatkan dalam satu sel, bukan dua sel yang berdekatan. Jika saya membukanya di notepad saya dapat melihat bahwa setiap baris dibungkus dengan tanda kutip. Jika ini dihapus, Excel akan menampilkan kolom dengan benar.

Contoh Masukan

1.2.3.4,rubbish1,rubbish2,reallyimportantdata

Keluaran yang Diinginkan

1.2.3.4    reallyimportantdata - two separate columns

Keluaran Sebenarnya

"1.2.3.4,reallyimportantdata" - single column

Pertanyaan

Apakah ada cara untuk memalsukan bagian format agar tidak ditulis dengan kutipan? Atau, apa cara terbaik untuk mencapai apa yang saya coba lakukan?

Saya sudah mencoba menulis ke file lain dan menghapus garis tetapi, meskipun tidak menimbulkan kesalahan, hasilnya sama ...

1
I_GNU_it_all_along 15 Agustus 2017, 17:51

2 jawaban

Jawaban Terbaik

writerow() mengambil daftar elemen dan menuliskannya masing-masing ke dalam kolom. Karena Anda memberi makan daftar dengan hanya satu elemen, itu ditempatkan ke dalam satu kolom.

Sebagai gantinya, berikan writerow() daftar:

processedcontent.writerow([first,fourth])
2
MrAlexBailey 15 Agustus 2017, 14:56

Sudahkah Anda mempertimbangkan untuk menggunakan Pandas?

import pandas as pd

df = pd.read_csv("myFile.csv", header=0, low_memory=False, index_col=None)
fid = open("outputp.csv","w")
for index, row in df.iterrows():
    aa=re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",row['IP'])
    if aa:
        tline = '{0},{1}'.format(row['IP'], row['fourth column'])
        fid.write(tline)
output.close()

Mungkin ada satu atau dua kesalahan dan saya mendapatkan regex dari di sini . Ini mengasumsikan baris pertama csv memiliki judul yang dapat direferensikan. Jika tidak, Anda dapat menggunakan header = None dan mereferensikan kolom dengan iloc

Kalau dipikir-pikir Anda mungkin bisa menjalankan regex pada dataFrame, salin kolom pertama dan keempat ke dataFrame baru dan gunakan metode to_csv di pandas.

1
Eric Jensen 15 Agustus 2017, 15:13