2016-07-18 45 views
3

我正在從in.txt讀取數據並從中寫入特定的行至Sample.xlsx。當我解析輸入數據的這一部分時,我在包含startend的行與我設置的Flag之間的數據進行了刷新。當設置爲Flag時,每當我遇到NAME:AGE:行時,它需要分別寫入C和D列(額外信息:輸入文件具有以下模式:第一行包含NAME,下一行包含AGE後跟空行並重復這種模式)。寫入xlsx在一個單元格中創建重複的行

start is here 
NAME:Abe 
AGE:40 

NAME:John 
AGE:20 

... 
end 

輸入與上述類似。現在問題是我有大約1000條這樣的線路,所以大概333個名字,年齡。當我運行代碼後打開Excel表時,我看到C2有NAME:Abe重複了21次。 D2也有AGE:40重複21次。我將輸入減少到100行,重複次數減少到3.我似乎無法弄清楚爲什麼會發生這種情況。當我改爲10行,即只有3個名字和年齡時,這個問題就不會發生。 C2只有一個名字,C3也有一個名字。

from openpyxl import Workbook, load_workbook 
fin = open('in.txt') 
fout1 = open('name.txt','w') 
fout2 = open('age.txt','w') 

wb = Workbook() 
ws = wb.active 

i = 2 
Flag = False 
for lines in fin: 
    if 'start' in lines: 
     Flag = True 
     continue 
    if Flag and 'end' in lines: 
     break 
    if Flag: 
     if 'NAME:' in lines: 
      fout1.write(lines) 
      ws['C'+str(i)] = lines 
     elif 'AGE:' in lines: 
      fout2.write(lines) 
      ws['D'+str(i)] = lines 
      i += 1 
wb.save(filename = 'Sample.xlsx') 

長時間寫道歉。但請讓我知道我在這裏做錯了什麼。

感謝您的閱讀。

______________________________________編輯-1 ________________________________

我只是想寫作基礎,從文本文件到Excel中使用下面的最少的代碼單元。

for line in fin: 
    ws['C'+str(i)] = line 
    i += 1 

這也會產生相同的錯誤。線在單元格內被多次寫入。而且它重複的次數會根據輸入文本文件中的行數增加。

__________________________________編輯-2 __________________________________

我似乎已經解決了這一問題,但仍然不知道爲什麼它被認爲是固定的。由於字符串打印沒有任何問題,我從lines中刪除了最後一個字符,它應該是下一行字符。現在一切都按預期工作。我不確定這是否是一個合適的解決方案,或者爲什麼會發生這種情況。無論如何,下面給出的代碼似乎解決了這個問題。

for line in fin: 
    ws['C'+str(i)] = line[:-1] 
    i += 1 
+0

我懷疑你的櫃檯有問題。您應該添加一些調試代碼,以查看它是否按照您的要求運行。 –

+0

我也這麼認爲。但是我把'ws ['C'+ str(i)] = lines'改成了'ws ['C'+ str(i)] ='hello',對D列也是類似的。然後''hello ''在一個單元中只出現一次。當我將當前的「線路」分配給該單元時,會發生問題。它只是重複多次。 – akhilc

+0

此外,我正在寫文本文件的名字和年齡以及相同的條件語句。而文本文件輸出沒有任何重複。 – akhilc

回答

1

嘗試和避免在Python中使用計數器是可能的和明智的做法。以下代碼更具表現力和可維護性。

from openpyxl import Workbook, load_workbook 
fin = open('in.txt', 'r') 

wb = Workbook() 
ws = wb.active 
ws.append([None, None, "NAME", "AGE"]) 

Flag = False 
for line in fin.readlines(): 

    if line.startswith("start"): 
     Flag = True 
     row = [None, None, None, None] 

    elif line.startswith("end"): 
     break 

    elif Flag: 
     if line.startswith('NAME:'): 
      row[2] = line[5:] 

     elif line.startswith('AGE:'): 
      row[3] = int(line[4:]) 
      ws.append(row) 

wb.save(filename = 'Sample.xlsx') 
fin.close() 
相關問題