Как работать с одной строкой файла за раз в python - PullRequest
0 голосов
/ 21 января 2020

отредактировано на основе ответа @Boendal.

Я работал над сценарием, и когда я думал, что все работает отлично, получается, что нет, и я не могу найти Решение или даже выяснить, почему мой лог c не работает. Я довольно новичок в 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)

и в другом сценарии, который использует этот файл в качестве ввода, который я хочу go построчно работайте над каждой строкой и переходите к другой. Я думал об удалении строки после того, как закончил (так что я всегда работаю над одной и той же строкой), но это кажется еще более сложным, поэтому я решил просто использовать a для l oop. Вот код:

(...)
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



          (...)

в основном то, что мне нужно сделать - это открыть файл, прочитать одну строку и проверить, какие числа в нем содержатся, и содержит ли оно конкретное c число. значение в ячейке Excel и перейти к следующей строке. Все работает, кроме циклического перебора строк ... Код читает только одну строку и помещает одинаковые значения во все ячейки, даже если каждая строка содержит различную комбинацию чисел.

Я был бы очень признателен, если бы Вы можете помочь мне решить это, потому что я смотрю на это уже несколько часов, и я действительно не вижу этого (и я почти уверен, что это простая логика c ошибка)

1 Ответ

0 голосов
/ 21 января 2020

Я думаю, что вы хотите сделать что-то вроде этого:

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 для циклов, а второй для l oop был не нужен. Я думаю, вы хотите, чтобы каждая строка вашего TXT-файла соответствовала строке в вашем Excel-файле. Но с вашим вторым значением для l oop вы перезаписываете каждое совпадение, которое происходит раньше, и в худшем случае вы получаете полный Excel с тем же значением, оцененным только для последней строки. Как правило, вам нужно записать значение только один раз для каждой строки, а не несколько раз.

  3. else и pass часть не нужна, и я удалил ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...