Как пропустить пустые строки в моем файле .txt при запуске программы на python

Я кодирую программу, которая читает и извлекает данные из текстового файла, а затем выполняет некоторые вычисления с данными.

Однако из-за пустых мест в моих текстовых файлах произошла ошибка при получении чисел. я получил

ValueError: неверный литерал для int() с base10: ' '

Мой текстовый файл выглядит так:

['flower', 'sdfsd', '21/08/2019 20:27:03', 1]

['hello', 'sdsdfsdf', '21/08/2019 20:27:36', '2']

['car', 'sdfsd', '21/08/2019 20:27:45', 1]

['table', 'sdfsdf', '21/08/2019 20:29:21', 1]

_(blank space \n)_

['shirt', 'sdfsdf', '21/08/2019 20:30:02', '2']

_(blank space \n)_

['hello', 'sdfsdf', '21/08/2019 20:30:07', '3']

и мой код для записи в текстовый файл из python выглядит так:

historyFile = open('history.txt','a')
historyFile.write("\n\r")
historyFile.write(file)
historyFile.close()

Я уже пробовал примеры в Интернете, такие как if not line.strip():, но он перестал извлекать данные после пустой строки.

Ниже приведены мои коды:

readFile = open('history.txt','r')
searching = readFile.readlines()
i=0
for line in searching:
    if i in range(len(searching)-1):
        i += 1
        oldCount = str(int(searching[i].split(",")[3][-4]))
        newCount = str(int(searching[i].split(",")[3][-4]) + 1)
        print("\nold count: " + oldCount + " new count: " + newCount)

Предполагается, что он пробежит все строки в моем текстовом файле и вернет числа в моем списке в позиции 3, но из-за пустых строк я получаю сообщение об ошибке

мой вывод


person finanza f    schedule 21.08.2019    source источник


Ответы (1)


Если ваш history.txt содержит (обратите внимание на пустые строки):

flower, 'sdfsd', '21/08/2019 20:27:03', 1
hello, 'sdsdfsdf', '21/08/2019 20:27:36', 2
car, 'sdfsd', '21/08/2019 20:27:45', 1
table, 'sdfsdf', '21/08/2019 20:29:21', 1

shirt, 'sdfsdf', '21/08/2019 20:30:02', 2

hello, 'sdfsdf', '21/08/2019 20:30:07', 3

Затем этот скрипт прочитает файл и напечатает последний столбец, увеличенный на 1:

with open('history.txt', 'r') as readFile:
    for i, line in enumerate(readFile, 1):
        line = line.strip()
        if not line:
            continue

        line_tuple = tuple(map(str.strip, line.split(',')))

        oldCount = int(line_tuple[3])
        newCount = oldCount + 1
        print("row no. {} old count: {} new count: {}".format(i, oldCount, newCount))

Отпечатки:

row no. 1 old count: 1 new count: 2
row no. 2 old count: 2 new count: 3
row no. 3 old count: 1 new count: 2
row no. 4 old count: 1 new count: 2
row no. 6 old count: 2 new count: 3
row no. 8 old count: 3 new count: 4

Изменить: если ваш history.txt содержит поля в кавычках:

'flower','sdfsd','21/08/2019 20:27:03','1'
'hello','sdsdfsdf','21/08/2019 20:27:36','2'
'car','sdfsd','21/08/2019 20:27:45','1'
'table','sdfsdf','21/08/2019 20:29:21','1'

'shirt','sdfsdf','21/08/2019 20:30:02','2'

'hello','sdfsdf','21/08/2019 20:30:07','3'

Вы можете использовать модуль csv, чтобы прочитать его:

import csv

with open('history.txt', 'r') as readFile:
    csvreader = csv.reader(readFile, delimiter=',', quotechar="'")

    for i, line in enumerate(csvreader, 1):
        if not line:
            continue

        oldCount = int(line[3])
        newCount = oldCount + 1
        print("row no. {} old count: {} new count: {}".format(i, oldCount, newCount))
person Andrej Kesely    schedule 21.08.2019
comment
если пользователь вводит слово в поле ввода «цветок», и я хочу добавить счет к этому слову, как мне найти именно ту строку, в которой есть слово «цветок»? - person finanza f; 21.08.2019
comment
@finanzaf У вас может быть if заявление, например if 'flower' in line[0]: ... - person Andrej Kesely; 21.08.2019
comment
но что, если я не знаю номер строки? Я думаю об использовании цикла, чтобы найти [i]. как мне это написать? - person finanza f; 22.08.2019
comment
@finanzaf line[0] — первый столбец. В переменной i у вас есть номер строки. поэтому, если 'flower' in line[0] == True, вы знаете номер строки. Он находится в переменной i. - person Andrej Kesely; 22.08.2019
comment
Итак, строка [i][3] даст мне количество слов, которые я набрал? - person finanza f; 22.08.2019
comment
@finanzaf Нет, i - это номер строки, переменная line содержит кортеж значений текущей строки. Например, line[0]='flower', line[1]='sdfsd', line[2]='21/08/2019 20:27:03' и line[3]=1. Я бы предложил поместить в код несколько операторов отладочной печати, чтобы увидеть, что содержит каждая переменная. - person Andrej Kesely; 22.08.2019