写入xlsx在一个单元格中创建重复的行

时间:2016-07-18 07:05:50

标签: python excel python-2.7 openpyxl

我正在从in.txt读取数据并将特定行写入Sample.xlsx。我在包含startend的行之间点击数据,并在解析此部分输入数据时设置Flag。设置Flag时,每当我在行中遇到NAME:AGE:时,都需要分别写入C和D列(额外信息:输入文件具有以下模式:第一行包含NAME,下一行包含AGE后跟一个空行,并重复此模式。

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

1 个答案:

答案 0 :(得分: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()