Python覆盖Ex中的数据

2024-05-04 00:56:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我不是每天都使用Python,我有一个错误,您可以帮我解决。我有以下代码:

import xlrd
import xlwt
import xlsxwriter

string1="Last password change"
string2="Password expires"
string3="Password inactive"
string4="Account expires"
string5="Minimum number of days between password change"
string6="Maximum number of days between password change"
string7="Number of days of warning before password expires"

workbook=xlsxwriter.Workbook('/media/sf_vboxshared/sample.xlsx')
worksheet1=workbook.add_worksheet('Sheet1')

with open('sample.txt','r') as dump:
   for line in dump:
       if string1 in line:
            tail1=line.split(string1)[1]
            tail1=tail1.strip()
            tail1=tail1.lstrip(":")
 for num, line in enumerate(dump, 1):
                if string1 in line:
                     worksheet1.write(num,1,string1)
                     worksheet1.write(num,2,tail1)
with open('sample.txt', 'r') as dump2:
   for line2 in dump2:
       if string2 in line2:
            tail2=line2.split(string2)[1]
            tail2=tail2.strip()
            tail2=tail2.lstrip(":")
            for num, line2 in enumerate(dump2, 1):
                if string2 in line2:
                     worksheet1.write(num,1,string2)
                     worksheet1.write(num,2,tail2)

workbook.close()

输入如下所示(示例.txt)地址:

rick
Last password change                                    : Feb 26, 2018
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

john
Last password change                                    : Feb 26, 2018
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

frank
Last password change                                    : Feb 26, 2018
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

romeo
Last password change                                    : Feb 26, 2018
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

这段代码的思想是,我想从示例.txt但格式正确。基本上,列:分隔列。运行此代码时,第二个“with”将覆盖该信息。有人能解释一下为什么会有这种行为,怎么能纠正吗?你知道吗

非常感谢, 罗曼。你知道吗


Tags: ofinnumberpasswordbetweenchangedaysnum
1条回答
网友
1楼 · 发布于 2024-05-04 00:56:10

您遇到的问题是由Python读取文件的方式引起的。 如果打开一个文件并开始从中读取,Python将返回光标位置的数据(第一次打开文件时,光标将位于0,因此文件的开头)。逐行读取将导致光标每次跳到下一行:

>>> with open('sample.txt','r') as dump:
    print dump.readline()
    print dump.readline()

将返回:

rick
Last password change                                    : Feb 24, 2018

在您的示例中,打开文件并开始逐行读取:

with open('sample.txt', 'r') as dump2:
   for line2 in dump2:

直到找到匹配的if string2 in line2:。此时,您开始enumerate遍历文件的其余部分,但光标已经移动,因此计数器与实际行数不匹配。你知道吗

试着这样做:

with open('sample.txt','r') as dump:
    for num, line in enumerate(dump):
        if string1 in line:
            tail1=line.split(string1)[1]
            tail1=tail1.strip()
            tail1=tail1.lstrip(":")
            worksheet1.write(num,1,string1)
            worksheet1.write(num,2,tail1)
        elif string2 in line:
            tail2=line.split(string2)[1]
            tail2=tail2.strip()
            tail2=tail2.lstrip(":")
            worksheet1.write(num,1,string2)
            worksheet1.write(num,2,tail2)

Here is how the xslx file looks like (rick的最后一次密码更改在第2行,密码过期日期在第3行等…)

相关问题 更多 >