【问题标题】:How to work on one line of a file at a time in python如何在python中一次处理文件的一行
【发布时间】:2020-01-21 12:52:25
【问题描述】:

根据@Boendal 回答编辑。

我一直在编写一个脚本,当我认为一切正常时,结果却没有,我找不到解决方案,甚至找不到我的逻辑为什么不起作用。我对python很陌生,所以如果它很简单,我很抱歉,但我希望看到它起作用。这是问题所在: 我有一个由另一个脚本生成的文本文件,其中包含带有数字组合的行,如下所示:

(1800, 2100, 2600, 1500, 900, 3700)
(1800, 2100, 2600, 900, 800, 3700)
(1800, 2100, 1500, 900, 800, 3700)
(1800, 2600, 1500, 900, 800, 3700)
(1800, 2100, 2600, 1500, 900, 3700)
(1800, 2100, 2600, 900, 800, 3700)
(1800, 2100, 1500, 900, 800, 3700)
(1800, 2100, 2600, 1500, 900, 3700)
(1800, 2100, 2600, 900, 800, 3700)
(1800, 2600, 1500, 900, 800, 3700)
(1800, 2100, 2600, 1500, 900, 3700)
(1800, 2100, 1500, 900, 800, 3700)
(1800, 2600, 1500, 900, 800, 3700)

在另一个使用此文件作为输入的脚本中,我想逐行处理,处理每一行并移至另一行。我想在完成后删除一条线(所以我总是在同一条线上工作)但这似乎更加复杂,所以我决定简单地使用 for 循环。这是一个代码:

(...)
for i, line in enumerate(lines):  
        i=i+1
        line_number = literal_eval(line)

        if "1800" in line_number:
            cell1800_a = sheet.cell(row=i,column=27)
            cell1800_a.value = number
            cell1800_b = sheet.cell(row=i,column=29)
            cell1800_b.value = number
            stf_18 = sheet.cell(row=i,column=50)
            stf_18.value = "radio7"
            stf18Q = sheet.cell(row=i,column=51)
            if number in range (1,2):
                stf18Q.value = 1
            elif number in range (3,4):
                stf18Q.value = 2
            elif number in range (5,6):
               stf18Q.value = 3
            if question1 == "y":
                cell1800_2g = sheet.cell(row=i,column=26)
                cell1800_2g.value = number

        if "2100" in line_number:
            cell2100_a = sheet.cell(row=i,column=25)
            cell2100_a.value = number
            stf18 = sheet.cell(row=i,column=52)
            stf18.value = "radio7"
            stf18Q = sheet.cell(row=i,column=53)
            if number in range (1,2):
                stf18Q.value = 1
            elif number in range (3,4):
                stf18Q.value = 2
            elif number in range (5,6):
                stf18Q.value = 3
            if question2 == "y":
                cell2100_b = sheet.cell(row=i,column=24)
                cell2100_b.value = number

        if "2600" in line_number:
            cell2600 = sheet.cell(row=i,column=30)
            cell2600.value = number
            stf26 = sheet.cell(row=i,column=54)
            stf26.value = "radio6"
            stf26Q = sheet.cell(row=i,column=55)
            if number in range (1,2):
                stf26Q.value = 1
            elif number in range (3,4):
                stf26Q.value = 2
            elif number in range (5,6):
                stf26Q.value = 3

        if "1500" in line_number:
            cell1500 = sheet.cell(row=i,column=34)
            cell1500.value = number
            stf15 = sheet.cell(row=i,column=48)
            stf15.value = "radio5"
            stf15Q = sheet.cell(row=i,column=49)
            stf15Q.value = number

        if "900 "in line_number:
            if question1 == "y":
                cell900_A = sheet.cell(row=i,column=31)
                cell900_A.value = number
                stf9 = sheet.cell(row=i,column=46)
                stf9.value = "radio4"
                stf9Q = sheet.cell(row=i,column=47)
                stf9Q.value = number
            if  question2 == "y":
                cell900_B = sheet.cell(row=i,column=32)
                cell900_B.value = number
                stf9 = sheet.cell(row=i,column=46)
                stf9.value = "radio3"
                stf9Q = sheet.cell(row=i,column=47)
                stf9Q.value = number

        if "800" in line_number:
            cell800 = sheet.cell(row=i,column=33)
            cell800.value = number
            stf8 = sheet.cell(row=i,column=44)
            stf8.value = "radio2"
            stf8Q = sheet.cell(row=i,column=45)
            stf8.value = number

        if "3700" in line_number:
            cell3700 = sheet.cell(row=i,column=40)
            cell3700.value = number
            stfa = sheet.cell(row=i,column=87)
            stfa.value = "radio1"
            stfaq = sheet.cell(row=i,column=88)
            stfaq.value = number



          (...)

基本上我需要做的是打开一个文件,读取一行并检查其中包含哪些数字,如果它包含特定数字,则在 Excel 单元格中输入一个值并移至下一行。除了实际循环各行之外,一切正常...代码只读取一行并将相同的值放入所有单元格中,即使每一行包含不同的数字组合。

如果你能帮我解决它,我将非常感激,因为我已经盯着它看了好几个小时了,我真的没有看到它(我很确定这是一个简单的逻辑错误)

【问题讨论】:

  • 通过你的行的迭代是正确的,尽管有更简单的方法来实现它。您是否知道您要查找的所有数字都存在于您作为示例代码提供的所有行中?除此之外,请注意您正在为行中的每个i 覆盖cell2100_a。也许您正在寻找一种“附加”数据的方法?
  • 你在哪里将number的值传递给变量number
  • 您可以直接使用您的列表进行迭代(这里是每个读取的行)
  • @offeltoffel 他们中的大多数是的,只有很小的差异。例如,第一行 (1800, 2100, 2600, 1500, 900, 3700) 包含 1500,而第二行没有,而是包含 800。 (1800, 2100, 2600, 900, 800, 3700)。无论如何,如果代码是正确的,这意味着我的逻辑在这里的其他地方不起作用......当你说我覆盖 cell2100_a (我不知道)是只有这一个还是实际上全部?
  • @Clément number 和所有其他变量都在代码的其他部分,因此 (...) 在代码块的两端。

标签: python excel loops file


【解决方案1】:

我认为你想要做的是这样的:

from ast import literal_eval
with open ("numbers.txt") as inFile:
    lines = inFile.readlines()

    for i, line in enumerate(lines,1): #start with 1 because excel row start with index = 1
        line_number = literal_eval(line)
        if 1800 in line_number :
            cell1800_a = sheet.cell(row=i,column=27)
            cell1800_a.value = number
            cell1800_b = sheet.cell(row=i,column=29)
            cell1800_b.value = number

        if 2100 in line_number:
            cell2100_a = sheet.cell(row=i,column=25)
            cell2100_a.value = number

        if 2600 in line_number :
            cell2600 = sheet.cell(row=i,column=30)
            cell2600.value = number

        if 1500 in line_number :
            cell1500 = sheet.cell(row=i,column=34)
            cell1500.value = number

        if 800 in line_number :
            cell800 = sheet.cell(row=i,column=33)
            cell800.value = number

        if 3700 in line_number :
            cell3700 = sheet.cell(row=i,column=40)
            cell3700.value = number

我改变了什么:

  1. 我将输入字符串评估为一个元组。原因是如果您在字符串中查找字符串 800,例如 (1800, 2100, 2600, 1500, 900, 3700),您会找到匹配项,因为 1800 中有 800。因此,为了避免这种情况,我对其进行了评估,现在我正在研究正确数字的元组,因此只有当数字 800 在元组中时它才会匹配,而上例中不是这种情况。

  2. 您有 2 个 for 循环,而第 2 个 for 循环是不必要的。我认为您希望 txt 文件的每一行都与您的 excel 文件中的行相对应。但是在你的第二个 for 循环中,你会覆盖之前发生的每一个匹配,在最坏的情况下,你有一个完整的 excel,它只为最后一行评估了相同的值。 基本上你只需要为每一行写一次值而不是多次。

  3. elsepass 部分是不必要的,我将其删除。

【讨论】:

  • 非常感谢!它有所帮助,但只是其中一种使它变得更加奇怪。现在它可以工作,但只适用于 800 ......还有一个问题,我从 0 开始,而 excel 单元格显然从 1 开始,但这是一个简单的解决方法。你可能知道为什么它现在只适用于 800 吗?
  • 嗯,这真的没有意义......你能告诉我你更新的代码吗? @Aleksa
  • 嗨!更新了我原来的问题。抱歉,代码更复杂,我认为这对实际程序并不重要,因为值 1500 和 800 具有相同的逻辑,只是值不同,而 1500 不起作用
  • @Aleksa 我不确定为什么 800 可以工作,但对我来说 800 甚至不应该工作。您试图在 int 列表中找到 "1800"(a String)。从您正在检查的号码中删除所有",然后重试(请参阅我的解决方案,因为您看到我删除了号码周围的")。
  • 是的,我也试过不使用它们,结果相同:P
猜你喜欢
  • 2016-10-17
  • 2016-10-14
  • 2015-07-07
  • 2016-06-05
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
相关资源
最近更新 更多