2016-05-13 74 views
2

我正在嘗試使用非常基本的文本文件作爲設置文件。三行以這種順序/格式重複,管理我的程序的一些設置/輸入。文本文件如下:來自文本文件的意外輸出 - 正確清理讀入行

Facebook 
1#3#5#2 
Header1#Header2#Header3#Header4 
... 

這是閱讀使用下面的Python代碼:

f = open('settings.txt', 'r') 
for row in f: 
    platform = f.readline() 
    rows_to_keep = int(f.readline().split('#')) 
    row_headers = f.readline().split('#') 

    clean_output(rows_to_keep, row_headers, platform) 

我希望在平臺上被讀取單個字符串,整數的第二和數組第三個字符串數組。然後這些被傳遞給函數,並且這被重複許多次。

然而,以下三件事情正在發生:

  1. 詮釋不轉換,我得到一個TypeError
  2. 在文本文件中的第一行被忽略和我行保持平臺
  3. \n在每一行的末尾

我懷疑這些是相關的,所以我只發佈一個問題。

+2

'f'中的行已經讀取了文件中的每一行。你不需要調用'readline()'。 –

回答

1
  1. 名單上

    不能調用INT,你需要做的做一些列表理解像

    rows_to_keep = [INT(A)爲在f.readline()。斯普利特( '#' )]

  2. 您正在讀取一行,然後從文件中讀取另一行。您應該執行某種切片(請參見Python how to read N number of lines at a time),或者在每三次迭代後用三行調用一個函數。

  3. 使用.strip()刪除行尾和其他空格。

+0

工作就像一個魅力 – NickP

0

這裏有幾件事情要做。首先,當你在第二行上進行拆分時,你試圖將list轉換爲int。這是行不通的。您可以改爲使用map

rows_to_keep = map(int,f.readline().strip().split("#")) 

另外,你會看到上面的strip()方法。這將刪除行中的尾部空白字符,即:\n

嘗試更改並在每個readline()調用上也使用strip()

1

試試這個:

with open('settings.txt', 'r') as f: 
    platform, rows_to_keep, row_headers = f.read().splitlines() 
    rows_to_keep = [int(x) for x in rows_to_keep.split('#')] 
    row_headers = row_headers.split('#') 

    clean_output(rows_to_keep, row_headers, platform) 
0

用盡可能少的變化有可能,我已經嘗試解決你的問題,並告訴你,你出了問題。 @丹尼爾的回答是我將如何親自解決問題。

f = open('settings.txt', 'r') 
#See 1. We remove the unnecessary for loop 
platform = f.readline() 
#See 4. We make sure there are no unwanted leading or trailing characters by stripping them out 
rows_to_keep = f.readline().strip().split('#') 
#See 3. The enumerate function creates a list of pairs [index, value] 
for row in enumerate(rows_to_keep): 
    rows_to_keep[row[0]] = int(row[1]) 
row_headers = f.readline().strip().split('#') 
#See 2. We close the file when we're done reading 
f.close() 

clean_output(rows_to_keep, row_headers, platform) 
  1. 你不需要(不想要的)for循環的f,以及調用的ReadLine。你應該選擇一個或另一個。
  2. 你需要關閉ff.close()。您可以將list中的元素轉換爲int。這可以通過for循環來完成。
  3. 你可能想打電話.strip擺脫尾隨的換行符。