我正在从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已经重复了21次。D2也重复了21次。我把输入减少到100行,重复减少到3行。我好像不明白为什么会这样。当我改成10行时,这个问题就不会发生了。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__________________________________
我似乎已经解决了这个问题,但仍然不知道为什么它得到了解决。因为字符串打印时没有任何问题,所以我从NAME:Abe中删除了最后一个字符,它应该是下一行字符。现在一切都如期而至。我不确定这是否是一个正确的解决方案,也不知道为什么会这样。不管怎样,下面给出的代码似乎解决了这个问题。
for line in fin:
    ws['C'+str(i)] = line[:-1]
    i += 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()

09-05 13:32
查看更多