Почему мое условие Python «если» не работает

Я пишу небольшую утилиту, которая будет считывать данные из файла с разделителями каналов. Если 4-е поле в каждой строке файла не пусто, я хочу записать эту строку в другой выходной файл.

Я пытаюсь перебрать каждую строку во входном файле, выделить поля в список, проверить, не является ли значение 4-го поля (3-й индекс) пустой строкой, и если да, то записать эту строку в другой файл.

Вместо этого он записывает каждую строку исходного входного файла в желаемый выходной файл, даже если значение 4-го поля (3-й индекс) ЯВЛЯЕТСЯ пустой строкой.

Что я делаю не так? Вот мой код:

lines = src_file.readlines()

for i in range(len(lines)):    
    fields = lines[i].strip("\n").split("|")
   
    if fields[3] != '':
        lines[i] = "|".join(fields) + "\n"
    
 
src_file.close()
output_file = open(output_file_name, "w+")
output_file.writelines(lines)
output_file.close()

Избавьтесь от привычки использовать for index in range(len(list)):. Используйте for item in list: или for index, item in enumerate(list):

Barmar 03.02.2023 00:37

Канонический способ проверки на непустость — это просто if fields[3]:.

Ken Y-N 03.02.2023 00:38

Вы никогда не удаляете строки с пустыми четвертыми полями из списка.

Barmar 03.02.2023 00:39
"|".join(fields) + "\n" совпадает с исходной строкой ввода. Вы не вносите никаких изменений в файл.
Barmar 03.02.2023 00:39

@Barmar Я думаю, что for i in range... здесь разумно, так как цель состоит в том, чтобы вернуть lines[i].

John Gordon 03.02.2023 00:41

@JohnGordon Тогда я бы использовал enumerate(). Но на самом деле нет необходимости назначать обратно lines[i].

Barmar 03.02.2023 00:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
65
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы никогда не удаляете строки с пустым полем из lines.

Вам не нужно изменять lines[i] (и вы этого не делаете, поскольку вы просто присоединяете fields обратно к исходной строке, из которой она была получена).

Вы должны сделать запись в выходной файл в цикле, чтобы вы могли пропустить строки, которые не соответствуют условию.

with open(src_file_name) as src_file, open(output_file_name, "w") as output_file:
    for line in src_file:
        fields = line.strip("\n").split("|")
        if fields[3]:
            output_file.write(line)

Если я правильно понимаю, вы хотели бы пропустить строку, если 3-е значение индекса является пустой строкой. Таким образом, условие должно быть точно таким же, как «если 3-е значение индекса является пустой строкой, пропустите строку». Я отредактировал ваш код, посмотрите, работает ли он:

lines = src_file.readlines()

for i in range(len(lines)):    
    fields = lines[i].strip("\n").split("|")
   
    if fields[3] == "":
        lines[i] = ""
    
src_file.close()

lines = [x for x in lines if x != ""]    #add this to skip the empty lines
output_file = open(output_file_name, "w+")
output_file.writelines(lines)
output_file.close()

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

Вот рабочий код:

output_file = open(output_file_name, "w+")
lines = src_file.readlines()

for i in range(len(lines)):    
    fields = lines[i].strip("\n").split("|")

    if fields[3] != '':
        output_file.write("|".join(fields) + "\n")

src_file.close()
output_file.close()

Другие вопросы по теме