Итерация по csv.reader () питонским способом - PullRequest
3 голосов
/ 27 марта 2019

Я разрабатываю программу, которая, среди прочего, читает csv с помощью csv.reader (). Я хочу сохранить переменные, которые соответствуют одному из двух условий, в двух разных переменных класса. Поскольку мне нравится писать списочные выражения, и я пытаюсь написать свой код более питоническим образом, мне было интересно, правильный ли это подход. Кажется, csv.reader () является объектом-генератором, потому что я могу повторить его всего один раз. Итак, для второго условия я создаю объект-читатель во второй раз. Мне кажется, это пустая трата ресурсов. Конечно, я мог бы написать это с нормальным циклом for и разными if-случаями. Но есть ли более питонный способ написать этот кусок кода?

with open(file, "r") as f:
    reader = csv.reader(f, delimiter=",")
    self.xitireq = [row[0] for row in reader if "xiti" in row[0]]
with open(file, "r") as f:
    reader = csv.reader(f, delimiter=",")
    self.apireq = [row[0] for row in reader if "https://www.blabal.de/api" in row[0]]

Если я напишу такой код, self.apireq будет пустым:

with open(file, "r") as f:
    reader = csv.reader(f, delimiter=",")
    self.xitireq = [row[0] for row in reader if "xiti" in row[0]]
    self.apireq = [row[0] for row in reader if "https://www.blabal.de/api" in row[0]]

1 Ответ

2 голосов
/ 27 марта 2019

Самое простое решение, которое я могу придумать, это сделать так, как вы хотите, вот так

with open(file, "r") as f:
    reader = list(csv.reader(f, delimiter=","))
    self.xitireq = [x for x in reader if "xiti" in x]
    self.apireq = [x for x in reader if "https://www.blabal.de/api" in x]

Единственное отличие состоит в том, что я преобразовал ваш ридер в список с помощью list (), основываясь на этой публикации Python импорт CSV в список и эту документацию https://docs.python.org/3/library/csv.html#csv.Dialect.

Может быть, в этот момент будет точнее переименовать читателя во что-то, но это только семантика.

...