2016-07-18 32 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() 
相关问题