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 независимо от того, какой разделитель я использую в скобках.

The source line (this is all on one line) in the .exp looks like: "*** Mean 1.8101587019969535e-003 1.7032095329860594e-003 1.1496630243258965e-003 1.1713999855908471e-003 4.7688994577955489e-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.1780140681716909e-001 1.4703089782231224e-001"

Но вывод в .csv больше не имеет разделения пробелами; все это находится в первой ячейке, тогда как я бы хотел, чтобы «***», «Среднее», «#####...», «####...» имели свою собственную ячейку.


person ksmith    schedule 24.06.2015    source источник
comment
== True лишние. Может быть, опубликовать одну из тех строк, которые вызывают проблемы?   -  person wardk    schedule 24.06.2015
comment
еще одна придирка: в режиме 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() и работали с новой строкой?   -  person GManika    schedule 24.06.2015
comment
input: elif line.startswith('***') == True: summary = line outMCfile.write(summary) outMCfile.write("\n") I get this in the .csv output: Mean 1.8101587019969535e-003 1.7032095329860594e-003 1.1496630243258965e-003 1.1713999855908471e-003 4.7688994577955489e-003 4.5573296301687650e-003...etc. все как одна непрерывная строка чисел в одной ячейке. Я бы предпочел не указывать заново, как он должен быть разграничен, когда я, наконец, открою его в 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)


Ну теперь очевидно, во всех предыдущих элифах ты пишешь одно значение из списка, а в двух последних пытаешься записать весь список в файл. Вы можете только записывать строки в файл. Снова преобразуйте его в строку:

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

или проще, возможно:

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

предполагая, что запятая является вашим разделителем csv

person wardk    schedule 24.06.2015
comment
аааа, вау, теперь это кажется очевидным... Я больше никогда так не буду! Большое спасибо всем. Это работает как шарм сейчас. - person ksmith; 24.06.2015