У меня есть 14000 строк с двумя полями в каждом CSV-файле, и я пытаюсь удалить некоторые строки, которые встречаются случайным образом. Я намерен сохранить все, кроме строк, содержащих любое из следующего: «Имя станции», «Код местоположения», «Параметр».
Я пытаюсь открыть файл, содержащий данные, вместе с новым пустым файлом csv, который будет использоваться для записи новых данных. Я пытаюсь перебрать каждую строку CSV-файла и записать в новый файл только те строки, в которых первое поле не равно ни одному из указанных значений.
Я пытаюсь сделать следующее, но получаю точную копию исходных данных.
import csv
with open('combined_csv.csv', newline='') as inp, open('edited.csv', 'w', newline='') as out:
writer = csv.writer(out)
for row in csv.reader(inp):
if row[0] != "Station Name" and "Location Code" and "Parameter":
writer.writerow(row)
Любая помощь приветствуется
Ваш оператор if не будет работать так, как вы ожидали. Если вы хотите проверить, что строка не совпадает с несколькими строками, я рекомендую вам сделать это следующим образом:
if row[0] not in ("Station Name", "Location Code", "Parameter"):
writer.writerow(row)
Обновление
Your version works well but why is mine not working?
if row[0] != "Station Name" and "Location Code" and "Parameter":
Вы пытаетесь проверить, что row[0]
не равно "Station Name" and "Location Code" and "Parameter"
.
Давайте распечатаем это:
>>>"Station Name" and "Location Code" and "Parameter"
'Parameter'
Почему? Проведем несколько экспериментов:
>>>"Station Name" and "Location Code" and "Test"
'Test'
>>>False and "Station Name" and "Location Code" and "Test"
False
>>>"" and "Station Name" and "Location Code" and "Test"
''
>>>"Station Name" and "Location Code" and "" and "Test"
''
Остались вопросы? Хорошо:
>>bool("Non-empty string")
True
>>>bool("")
False
Итак, ваш код эквивалентен
if row[0] != "Parameter":
Как правильно написать.
if row[0] != "Station Name" and row[0] != "Location Code" and row[0] != "Parameter":
@pba увидеть предложенный дубликат; это общая проблема
@pba, я обновил свой ответ.
Сейчас ясно. Спасибо!
@pba, если вы хотите использовать мой вариант, лучше использовать вариант, предложенный в дублирующем вопросе с набором. Я имею в виду if row[0] not in {"Station Name", "Location Code", "Parameter"}:
Спасибо за ответ. Ваша версия работает хорошо, но почему моя не работает?