Python: parsing .exp ke .csv

Saya menelusuri direktori file .exp, mengambil info yang saya inginkan dari masing-masing file, lalu mengkompilasinya menjadi file .csv. itu tidak elegan, tapi ini dia:

    outMCfile = open(os.path.join(workingDir,'output',date+'NeptuneCdSummary.csv'),'w+')
for fn in fileList:
    infile = os.path.join(workingDir,fn)

    tmpHeader = open(infile,'r').readlines()
    for line in tmpHeader:
        line = line.strip()
        if line.startswith('Date') == True:
            doa = line.split(' ')
            doa = doa[1]
            outMCfile.write(doa)
            outMCfile.write("\n")
        elif line.startswith('Run number') == True:
            run = line.split(':')
            run = run[1].strip()
            outMCfile.write(run)
            outMCfile.write("\n")
        elif line.startswith('Comment') == True:
            comment = line.split(':')
            comment = comment[1].strip()
            outMCfile.write(comment)
            outMCfile.write("\n")
        elif line.startswith('SampleType') == True:
            samType = line.split(':')
            samType = samType[1].strip()
            outMCfile.write(samType)
            outMCfile.write("\n")
        elif line.startswith('Cycle') == True:
            labels = line
            outMCfile.write(labels)
            outMCfile.write("\n")
        elif line.startswith('***') == True:
            summary = line
            outMCfile.write(summary)
            outMCfile.write("\n")

outMCfile.close()

dua kondisi terakhir dalam loop for (baris yang dimulai dengan "Cycle" dan "***") lebarnya 22-32 kolom (ada yang indeks, ada yang float). Bagaimana cara membatasi hasilnya? Saya baru saja mendapatkan serangkaian angka panjang di CSV keluaran saya untuk setiap baris tersebut, semuanya di sel yang sama. Dan jika saya menggunakan line.split(), saya mendapatkan TypeError terlepas dari pembatas mana yang saya gunakan dalam tanda kurung.

Baris sumber (ini semua dalam satu baris) di .exp terlihat seperti: "*** Mean 1.8101587019969535e-003 1.7032095329860594e-003 1.1496630243258965e-003 1.1713999855908471e-003 4.76 88994577955489e-003 4.5573296301687650e-003 3.9930890896827012e- 002 2.0829073529889563e-002 9.3939542591824787e-001 9.5234032647735734e-001 1.7299477345544945e+000 2.5226638938456563e+000 2,17 80140681716909e-001 1.4703089782231224e-001"

Namun output di .csv tidak lagi memiliki pemisahan spasi; semuanya ada di sel pertama, sedangkan saya ingin "***", "Mean", "#####...","####..." masing-masing memiliki selnya sendiri.


person ksmith    schedule 24.06.2015    source sumber
comment
== True tidak berguna. Mungkin memposting salah satu baris yang menimbulkan masalah?   -  person wardk    schedule 24.06.2015
comment
masalah lain: dalam mode outMCfile = open(...), 'w' sudah cukup karena Anda tidak pernah membacanya.   -  person ivan_pozdeev    schedule 24.06.2015
comment
Terima kasih atas tipnya kembali. the == True...Saya masih pada level yang kikuk dengan Python, selalu mencari tips yang lebih efisien. Inilah yang menyebabkan masalah, khususnya: elif line.startswith('Cycle') == True: labels = line outMCfile.write(labels) outMCfile.write("\n") elif line.startswith('***') == True: summary = line outMCfile.write(summary) outMCfile.write("\n")   -  person ksmith    schedule 24.06.2015
comment
Bisakah Anda memberikan contoh baris untuk kasus yang menarik?   -  person ivan_pozdeev    schedule 24.06.2015
comment
apakah Anda mencoba baris baru = ringkasan.split() dan mengerjakan baris baru?   -  person GManika    schedule 24.06.2015
comment
masukan: elif line.startswith('***') == True: summary = line outMCfile.write(summary) outMCfile.write("\n") Saya mendapatkan ini di keluaran .csv: Mean 1.8101587019969535e-003 1.7032095329860594e-003 1.1496630243258965e-003 1.1713999855908471e-003 4.76889 94577955489e-003 4.5573296301687650e-003...dst. semuanya sebagai satu rangkaian angka yang berkesinambungan dalam sel yang sama. Saya lebih suka tidak perlu menentukan ulang bagaimana batasnya ketika saya akhirnya membukanya di excel nanti (maaf, ini sulit untuk ditampilkan di sini...)   -  person ksmith    schedule 24.06.2015
comment
Dua saran perbaikan lagi: 1) .readliness + line.strip() -› for line in (line.strip() for line in <file>); 2) gunakan modul csv.   -  person ivan_pozdeev    schedule 24.06.2015


Jawaban (1)


Sudah jelas sekarang, di semua elif sebelumnya Anda menulis satu nilai dari daftar, dan di dua nilai terakhir Anda mencoba menulis seluruh daftar ke file. Anda hanya dapat menulis string ke file. Ubah menjadi string lagi:

outMCfile.write(','.join(line.split()))

atau mungkin lebih sederhana:

 outMCfile.write(line.replace(' ', ','))

dengan asumsi koma adalah pemisah csv Anda

person wardk    schedule 24.06.2015
comment
ahhh, wow, itu tampak jelas sekarang...Saya tidak akan pernah melakukannya lagi! Terima kasih banyak untuk semuanya. Ini bekerja dengan sangat baik sekarang. - person ksmith; 24.06.2015