Я пишу небольшую утилиту, которая будет считывать данные из файла с разделителями каналов. Если 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()
Канонический способ проверки на непустость — это просто if fields[3]:.
Вы никогда не удаляете строки с пустыми четвертыми полями из списка.
"|".join(fields) + "\n" совпадает с исходной строкой ввода. Вы не вносите никаких изменений в файл.
@Barmar Я думаю, что for i in range... здесь разумно, так как цель состоит в том, чтобы вернуть lines[i].
@JohnGordon Тогда я бы использовал enumerate(). Но на самом деле нет необходимости назначать обратно lines[i].






Вы никогда не удаляете строки с пустым полем из 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()
Избавьтесь от привычки использовать
for index in range(len(list)):. Используйтеfor item in list:илиfor index, item in enumerate(list):