#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 до n меняется каждый раз, когда я пишу CSV-файл.
Как я и пытался, я хотел бы удалить ненужные строки ниже, проверяя, не превышает ли каждое значение в определенном столбце 5.
Комментарии:
1. Вы можете использовать
next()
2. Исправлены ли восемь последних строк? Вы упомянули, что только строки с
string1
tostringn
меняются с каждым csv3. @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
в python2. @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 не являются фиксированными, вы можете использовать приведенный выше код следующим образом.