2017-07-26 68 views
0

我正在嘗試使用配置解析器來跟蹤需要在程序之間傳遞的一些變量。 (我不確定這是ConfigParser的意思,但它是程序如何工作,所以我仍然在使用它。)ConfigParser正在做這個奇怪的事情,但是,在最後的文件會添加幾行空白行,然後用文本重複前一行的最後幾個字符(或者有時來自前一行的文本)。老實說,如果你只是運行下面的代碼,就會更容易理解。ConfigParser無意中添加額外的行和字符

無論如何,我搜索了網頁,找不到任何提到這個問題。任何想法有什麼不對?我應該放棄並嘗試不同的圖書館嗎?

任何和所有的幫助表示讚賞,非常感謝你!

操作系統:Windows使用Python 2.7.10

代碼重現錯誤(變化<>用戶到用戶):

from ConfigParser import ConfigParser 
import os 

def create_batch_file(name, config_dir, platform, ABCD, batch_ID, speed, parallel, turbo=False): 
    ## setup batch_info.ini 
    batch_ini = os.path.join(config_dir, "batch_info.ini") 

    # Cast to string in case they are none object 
    batch_ID = str(batch_ID).lower() 
    parallel = str(parallel).lower() 

    if parallel == "none": 
     parallel = 1 

    batch_ini_contents = ["[Machine]\n", 
          "name = {}\n".format(name), 
          "platform = {}\n".format(platform), 
          "\n", 
          "[Environment]\n", 
          "turbo = {}\n".format(turbo), 
          "speed = {}\n".format(speed), 
          "\n", 
          "[Batch]\n", 
          "batch_id = {}\n".format(batch_ID), 
          "ABCD = {}\n".format(ABCD), 
          "parallel = {}\n".format(parallel), 
          "rerun = False\n", 
          "\n" 
          "[Reservation]\n" 
          "reserved = False\n" 
          "purpose = None" 
          ] 

    with open(batch_ini, 'w+') as f: 
     f.writelines(batch_ini_contents) 

    return batch_ini 

def temp_getter(config_dir): 
    config = config_dir 
    fl = ConfigParser() 
    fl.read(config) 
    return fl 

config_dir = "C:\\Users\\<user>\\Desktop" 

batch_ini = os.path.join(config_dir, "batch_info.ini") 

name = "m" 
platform = "p" 
turbo = False 
speed = "default" 
batch_ID = 5 
ABCD = 'abcd' 
parallel = 1 
purpose = "hello hello hello" 

create_batch_file(config_dir=config_dir, ABCD=ABCD, turbo=turbo, 
batch_ID=batch_ID, parallel=parallel, speed=speed, name=name, 
platform=platform) 

f = temp_getter(batch_ini) 
f.set('Reservation', 'reserved', 'True') 
f.set('Reservation', 'purpose', purpose) 
with open(batch_ini, 'r+') as conf: 
    f.write(conf) 

f = temp_getter(batch_ini) 
f.set('Reservation', 'reserved', 'False') 
f.set('Reservation', 'purpose', 'None') 
with open(batch_ini, 'r+') as conf: 
    f.write(conf) 

回答

0

您打開的文件與模式r+寫作。 The documentation for open指出這不會截斷文件。實際上,你只是覆蓋文件的一部分。

我將模式更改爲w+,多餘的線條不再存在。

+0

由於某種原因,昨天當我使用w +時,我留下了一個空白文件,所以我切換到r +。但是你是對的,切換到w +似乎解決了這個問題。在排除故障時,我必須更換別的東西。無論如何,非常感謝!真心讚賞! – Shmuelt