将多行写入字符串中包含多个%s的文本文件

时间:2019-01-25 03:31:07

标签: python

我正在尝试向文本文件中写很多行,但是每行包含很多日期。

代码如下:

public void onCheckboxClicked(View view) {

    boolean checked = ((CheckBox) view).isChecked();

    switch(view.getId()) {
        case R.id.chk1:
            if (checked)
            {System.out.println("if Part);}
              else
           {System.out.println("Else Part);}

            break;
        Perform your logic
    }
}

我想使其更整洁。看到了这篇文章:Python - multiple %s string,但是我应该将格式部分放在哪里?每行还是我可以把它放在外面?

3 个答案:

答案 0 :(得分:0)

我建议使用str.format而不是旧格式。

directory = r'C:\SPAN'

names = [
    r'Load C:\SPAN\RiskFiles\%s\SGX.%s.s.pa2',
    r'Load C:\SPAN\RiskFiles\%s\cfe.%s.s.pa2', 
    r'Load C:\SPAN\RiskFiles\%s\cme.%s.s.pa2', 
    r'Load C:\SPAN\RiskFiles\%s\hkex.%s.s.pa2',
    r'Load C:\SPAN\RiskFiles\%s\Jsc%s_1700.pa2', 
    r'Load C:\SPAN\Positions\%s\CME_Span_pos_%s.pos',
    r'Load C:\SPAN\Positions\%s\HKFE_Span_pos_%s.pos',
    r'Load C:\SPAN\Positions\%s\OSE_Span_pos_%s.pos',
    r'Load C:\SPAN\Positions\%s\SGX_Span_pos_%s.pos',
    r'Load C:\SPAN\Positions\%s\XCME_Span_pos_%s.pos',
    r'Load C:\SPAN\Positions\%s\XNYM_Span_pos_%s.pos',
    'Calc',
    r'SaveCalcSummary C:\SPAN\Reports\%s\%s.csv',
    r'Save C:\SPAN\Reports\%s\%s.xml',
    r'LogSave C:\SPAN\Reports\%s\logtest.txt'
]
with open(os.path.join(directory, 'SPANscript.txt'), 'w') as OPATH:
    OPATH.writelines(name.replace('%s', '{0}').format(rundate.strftime("%Y-%m-%d")) for name in names)

当然,如果您可以手动将文件名修改为具有{0}而不是%s,则可以放弃.replace('%s', '{0}')

答案 1 :(得分:0)

您可以在此处使用列表理解。例如

...
lines = [
    r'Load C:\SPAN\RiskFiles\%s\SGX.%s.s.pa2', 
    r'Load C:\SPAN\RiskFiles\%s\cfe.%s.s.pa2',
    ...]
formatted_date = rundate.strftime("%Y-%m-%d")
OPATH.writelines([line % (formatted_date, formatted_date) for line in lines])

按照@ Tomothy32的建议,切换到较新的字符串格式方法也是一个好主意。

答案 2 :(得分:0)

当您有要写入的行的预设列表时,我看不到通过引入循环来增加复杂性的价值-您所需要的只是将日期注入到 template 中的一种更整洁的方式,因此像这样的东西:

directory = r'C:\SPAN'
date = rundate.strftime('%Y-%m-%d')

with open(os.path.join(directory, 'SPANscript.txt'), 'w') as f:
    f.write(r'Load C:\SPAN\RiskFiles\{d}\SGX.{d}.s.pa2' '\n'
            r'Load C:\SPAN\RiskFiles\{d}\cfe.{d}.s.pa2' '\n'
            r'Load C:\SPAN\RiskFiles\{d}\cfe.{d}.s.pa2' '\n'
            r'Load C:\SPAN\RiskFiles\{d}\cme.{d}.s.pa2' '\n'
            r'Load C:\SPAN\RiskFiles\{d}\hkex.{d}.s.pa2' '\n'
            r'Load C:\SPAN\RiskFiles\{d}\Jsc{d}_1700.pa2' '\n'
            r'Load C:\SPAN\Positions\{d}\CME_Span_pos_{d}.pos' '\n'
            r'Load C:\SPAN\Positions\{d}\HKFE_Span_pos_{d}.pos' '\n'
            r'Load C:\SPAN\Positions\{d}\OSE_Span_pos_{d}.pos' '\n'
            r'Load C:\SPAN\Positions\{d}\SGX_Span_pos_{d}.pos' '\n'
            r'Load C:\SPAN\Positions\{d}\XCME_Span_pos_{d}.pos' '\n'
            r'Load C:\SPAN\Positions\{d}\XNYM_Span_pos_{d}.pos' '\n'
            'Calc\n'
            r'SaveCalcSummary C:\SPAN\Reports\{d}\{d}.csv' '\n'
            r'Save C:\SPAN\Reports\{d}\{d}.xml' '\n'
            r'LogSave C:\SPAN\Reports\{d}\logtest.txt'.format(d=date))

应该绰绰有余,而且它将像file.writelines()一样正确处理换行符(请参阅我对@Tomothy32answer的评论)。