Python: แยกวิเคราะห์ .exp เป็น .csv

ฉันกำลังเดินผ่านไดเร็กทอรีของไฟล์ .exp โดยดึงข้อมูลที่ฉันต้องการจากแต่ละไฟล์ จากนั้นคอมไพล์เป็นไฟล์ .csv มันไม่สง่างาม แต่นี่คือ:

    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()

สองเงื่อนไขสุดท้ายในลูป for (บรรทัดที่ขึ้นต้นด้วย "Cycle" และ "***") มีความกว้าง 22-32 คอลัมน์ (บางรายการเป็นดัชนี บางรายการเป็นแบบทศนิยม) ฉันจะกำหนดขอบเขตผลลัพธ์ได้อย่างไร ฉันเพิ่งได้รับตัวเลขชุดยาวใน CSV เอาท์พุตของฉันสำหรับแต่ละบรรทัดเหล่านั้นทั้งหมดในเซลล์เดียวกัน และถ้าฉันใช้ line.split() ฉันจะได้รับ TypeError โดยไม่คำนึงว่าฉันจะใช้ตัวคั่นใดในวงเล็บ

บรรทัดต้นฉบับ (ทั้งหมดนี้อยู่ในบรรทัดเดียว) ใน .exp ดูเหมือนว่า: "*** 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 3.8076954346734854e-001 1.8291027001438267e+000 2.6616393017410958e+000 4.0608176179586236e-001 1.5082949448806580e+000 2.17 80140681716909e-001 1.4703089782231224e-001"

แต่เอาต์พุตใน .csv ไม่มีการแยกช่องว่างอีกต่อไป ทั้งหมดอยู่ในเซลล์แรก ในขณะที่ฉันต้องการ "***", "Mean", "#####...","####..." เพื่อให้แต่ละเซลล์มีเซลล์ของตัวเอง


person ksmith    schedule 24.06.2015    source แหล่งที่มา
comment
== True นั้นไม่จำเป็น อาจโพสต์หนึ่งในบรรทัดเหล่านั้นที่ทำให้เกิดปัญหา?   -  person wardk    schedule 24.06.2015
comment
nitpick อื่น: ในโหมด outMCfile = open(...), 'w' ก็เพียงพอแล้วเนื่องจากคุณไม่เคยอ่านเลย   -  person ivan_pozdeev    schedule 24.06.2015
comment
ขอบคุณสำหรับคำแนะนำอีกครั้ง the == True...ฉันยังอยู่ในระดับที่ไม่น่าเชื่อใน Python และมองหาเคล็ดลับที่เพรียวลมเพิ่มเติมอยู่เสมอ นี่คือสิ่งที่ทำให้เกิดปัญหา โดยเฉพาะ: 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
คุณช่วยยกตัวอย่างบรรทัดสำหรับกรณีที่สนใจได้ไหม?   -  person ivan_pozdeev    schedule 24.06.2015
comment
คุณลอง newline = summary.split() และใช้งาน newline หรือไม่   -  person GManika    schedule 24.06.2015
comment
อินพุต: elif line.startswith('***') == True: summary = line outMCfile.write(summary) outMCfile.write("\n") ฉันได้รับสิ่งนี้ในเอาต์พุต .csv: Mean 1.8101587019969535e-003 1.7032095329860594e-003 1.1496630243258965e-003 1.1713999855908471e-003 4.76889 94577955489e-003 4.5573296301687650e-003...ฯลฯ ทั้งหมดเป็นตัวเลขต่อเนื่องกันหนึ่งชุดในเซลล์เดียวกัน ฉันไม่ต้องการระบุซ้ำว่าควรคั่นด้วยวิธีการใดเมื่อในที่สุดฉันก็เปิดมันใน Excel ในภายหลัง (ขออภัย นี่เป็นการยากที่จะแสดงที่นี่...)   -  person ksmith    schedule 24.06.2015
comment
คำแนะนำในการปรับปรุงเพิ่มเติมอีกสองข้อ: 1) .readliness + line.strip() -› for line in (line.strip() for line in <file>); 2) ใช้ csv โมดูล   -  person ivan_pozdeev    schedule 24.06.2015


คำตอบ (1)


ตอนนี้มันชัดเจนแล้ว ใน elifs ก่อนหน้านี้ทั้งหมด คุณเขียนค่าหนึ่งค่าจากรายการ และในสองค่าสุดท้าย คุณพยายามเขียนรายการทั้งหมดลงในไฟล์ คุณสามารถเขียนสตริงลงในไฟล์ได้เท่านั้น แปลงเป็นสตริงอีกครั้ง:

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

หรือง่ายกว่านั้นคือ:

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

สมมติว่าเครื่องหมายจุลภาคเป็นตัวคั่น csv ของคุณ

person wardk    schedule 24.06.2015
comment
อ่า ว้าว มันดูเหมือนชัดเจนแล้ว...ฉันจะไม่ทำแบบนั้นอีกแล้ว! ขอบคุณมากสำหรับทุกคน มันทำงานเหมือนมีเสน่ห์ตอนนี้ - person ksmith; 24.06.2015