【问题标题】:Writing to xlsx creating duplicate lines in one cell写入 xlsx 在一个单元格中创建重复行
【发布时间】:2016-07-18 18:45:15
【问题描述】:

我正在从in.txt 读取数据并将其中的特定行写入Sample.xlsx。我在包含startend 的行之间查找数据,并在解析这部分输入数据时设置Flag。设置Flag时,每当遇到NAME:AGE:在行中,都需要分别写入C列和D列(额外信息:输入文件有以下模式:第一行包含NAME,next行包含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')

为长篇大论道歉。但请让我知道我在这里做错了什么。

感谢阅读。

______________________________________ Edit-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

【问题讨论】:

  • 我怀疑您的计数器有问题。您应该添加一些调试代码,看看它是否按照您的意愿运行。
  • 我也是这么想的。但是我将ws['C'+str(i)] = lines 更改为ws['C'+str(i)] = 'hello',对于D 列也是如此。这样做之后,'hello' 在一个单元格中只出现一次。当我将当前lines 分配给该单元格时,就会出现问题。它只会重复多次。
  • 我也在相同的条件语句下将姓名和年龄写入文本文件。并且文本文件输出没有任何重复。
  • 写入其他文件不涉及计数器。就像我说的,添加一些调试代码,看看是在什么条件下编写的。
  • 是的,文本输出不涉及计数器。仍然当我分配像'hello' 这样的字符串而不是lines 时,它不会在单元格内重复。我会继续努力的。

标签: python excel python-2.7 openpyxl


【解决方案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()

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多