Как проверить определенное значение столбца и пропустить определенную строку

#python #csv

Вопрос:

введите описание изображения здесь

 import ctypes
import csv

with open('data.csv') as csv_file:
  reader = csv.reader(csv_file)
  next(reader)

  for row in reader:
     if(int(row[3])>=5):
         print(row)
         mymessage = 'A message'
         title = 'Popup window'
         ctypes.windll.user32.MessageBoxA(0, mymessage, title, 0)
     else:
    continue
 

В настоящее время у меня есть вышеуказанный csv-файл и код. Однако, когда я это сделаю print(row) ,

 ['string1','00','00','21','00'..]
['string2','00','00','84','00'..]
['string3','00','00','21','00'..]
['string4','00','00','21','00'..]
               .
               .
               .
['string7','00','00','21','00'..]
['string8','00','00','84','00'..]
['string9','00','00','15','00'..]
['string10','00','00','84','00'..]
['       ','precision','recall','f1-score','support'..]
 

Он печатается, как показано выше.

 with open('data.csv') as csv_file:
  reader = csv.reader(csv_file)
  next(reader)

  for row in reader[1:-8]:
         print(row)
         if(int(row[3])>=5):
              mymessage = 'A message'
              title = 'Popup window'
              ctypes.windll.user32.MessageBoxA(0, mymessage, title, 0)
         else:
            continue
 

Поэтому, чтобы игнорировать красную часть изображения, я подумал, что могу пропустить последние восемь строк приведенного выше кода. Но есть одна проблема.

Мои две проблемы с использованием этого:

  1. Я не знаю общего количества строк, потому что
  2. количество строк от 1 до n меняется каждый раз, когда я пишу CSV-файл.

Как я и пытался, я хотел бы удалить ненужные строки ниже, проверяя, не превышает ли каждое значение в определенном столбце 5.

Комментарии:

1. Вы можете использовать next()

2. Исправлены ли восемь последних строк? Вы упомянули, что только строки с string1 to stringn меняются с каждым csv

3. @QuagTeX Да, форма фиксирована, и значение меняется каждый раз. Потому что я использую classification_report функциональную ссылку .

4. @PCM, я знаю next(reader) , пропускает первую строку(и поэтому я уже использовал ее.). Можете ли вы рассказать мне более подробную информацию? Должен ли я использовать next(row[:-8]) это после next(reader) этого ?

Ответ №1:

Это дает вам количество строк вашего csv-файла перед его импортом в python.

 lines = sum(1 for line in open('data.csv'))  # gives you the total number of lines without loading csv
 

Затем вы можете импортировать его без последних 8 строк (как в примере с пандами ниже).

 import pandas as pd

data = pd.read_csv('data.csv', delimiter=';', decimal='.', header=0, skipfooter=8)  # loads the csv without last 8 rows
 

или вы загружаете его со своим кодом без последних 8 строк.

Подключение вашего кода должно быть:

 lines = sum(1 for line in open('data.csv'))  # gives you the total number of lines without loading csv
with open('data.csv') as csv_file:

  reader = csv.reader(csv_file)
  next(reader)

  for row in range(lines-8):  # using the number of lines here. It doesn't even load the last 8 lines
         print(row)
         if(int(row[3])>=5):
              mymessage = 'A message'
              title = 'Popup window'
              ctypes.windll.user32.MessageBoxA(0, mymessage, title, 0)
         else:
            continue

 

Комментарии:

1. Я уже знал, что в Панде есть skipfooter недвижимость, после некоторых поисков. Не могли бы вы, пожалуйста, сообщить мне более конкретно, как включить ваш код в код, который у меня есть? Я видел много решений, подобных вашему, но я не знаю, как их объединить, потому что я не использую панд. Теперь я использую with open в python

2. @Emma Lim Я отредактировал свой ответ. Это должно сделать работу

3. Я думаю, что этот ответ не имеет смысла. for row in range(lines-8) означает, что строка теперь имеет тип int. Однако для кода, стоящего за if(int(row[3])>=5): ним, требуется строка[3], представляющая собой массив. Поэтому, конечно, возникают ошибки.

Ответ №2:

Наконец — то я получил ответ. Мы можем заставить считыватель csv считывать определенный диапазон строк itertools.islice .

 from itertools import islice

with open('data.csv') as csv_file:
   reader = csv.reader(csv_file)
   #next(reader) We don't need this anymore beacause we read only certain rows.

   for row in islice(reader, 0, 10): #reads the row from 1 to 11
       print(row)
     if(int(row[3])>=5):
          mymessage = 'A message'
          title = 'Popup window'
          ctypes.windll.user32.MessageBoxA(0, mymessage, title, 0)
     else:
        continue
 

Поэтому я использовал этот код.

 lines = sum(1 for line in open('data.csv'))

for row in islice(reader, 0, lines)
         
 

В случае, если ваши общие строки csv не являются фиксированными, вы можете использовать приведенный выше код следующим образом.